大數(shù)據(jù)的文件讀取
① 利用生成器generator
②迭代器進行迭代遍歷:for line in file
迭代器和生成器的區(qū)別
1)迭代器是一個更抽象的概念,任何對象,如果它的類有next方法和iter方法返回自己本身。對于string、list、dict、tuple等這類容器對象,使用for循環(huán)遍歷是很方便的。在后臺for語句對容器對象調(diào)用iter()函數(shù),iter()是python的內(nèi)置函數(shù)。iter()會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內(nèi)元素,next()也是python的內(nèi)置函數(shù)。在沒有后續(xù)元素時,next()會拋出一個StopIteration異常
2)生成器(Generator)是創(chuàng)建迭代器的簡單而強大的工具。它們寫起來就像是正規(guī)的函數(shù),只是在需要返回數(shù)據(jù)的時候使用yield語句。每次next()被調(diào)用時,生成器會返回它脫離的位置(它記憶語句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)
區(qū)別:生成器能做到迭代器能做的所有事,而且因為自動創(chuàng)建了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節(jié)省內(nèi)存。除了創(chuàng)建和保存程序狀態(tài)的自動方法,當(dāng)發(fā)生器終結(jié)時,還會自動拋出StopIteration異常
裝飾器的作用和功能
引入日志
函數(shù)執(zhí)行時間統(tǒng)計
執(zhí)行函數(shù)前預(yù)備處理
執(zhí)行函數(shù)后的清理功能
權(quán)限校驗等場景
緩存
Global Interpreter Lock(全局解釋器鎖)
Python代碼的執(zhí)行由Python 虛擬機(也叫解釋器主循環(huán),CPython版本)來控制,Python 在設(shè)計之初就考慮到要在解釋器的主循環(huán)中,同時只有一個線程在執(zhí)行,即在任意時刻,只有一個線程在解釋器中運行。對Python 虛擬機的訪問由全局解釋器鎖(GIL)來控制,正是這個鎖能保證同一時刻只有一個線程在運行。
在多線程環(huán)境中,Python 虛擬機按以下方式執(zhí)行:
1. 設(shè)置GIL2. 切換到一個線程去運行3. 運行: a. 指定數(shù)量的字節(jié)碼指令,或者
b. 線程主動讓出控制(可以調(diào)用time.sleep(0))4. 把線程設(shè)置為睡眠狀態(tài)5. 解鎖GIL6. 再次重復(fù)以上所有步驟
在調(diào)用外部代碼(如C/C++擴展函數(shù))的時候,GIL 將會被鎖定,直到這個函數(shù)結(jié)束為止(由于在這期間沒有Python 的字節(jié)碼被運行,所以不會做線程切換)。
find和grep
grep命令是一種強大的文本搜索工具,grep搜索內(nèi)容串可以是正則表達式,允許對文本文件進行模式查找。如果找到匹配模式,grep打印包含模式的所有行。
find通常用來再特定的目錄下搜索符合條件的文件,也可以用來搜索特定用戶屬主的文件。
線上服務(wù)可能因為種種原因?qū)е聮斓粼趺崔k?
linux下的后臺進程管理利器 supervisor
每次文件修改后再linux執(zhí)行 service supervisord restart
如何提高python的運行效率
使用生成器;關(guān)鍵代碼使用外部功能包(Cython,pylnlne,pypy,pyrex);針對循環(huán)的優(yōu)化--盡量避免在循環(huán)中訪問變量的屬性
常用Linux命令
ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date
Python中的yield用法
yield簡單說來就是一個生成器,這樣函數(shù)它記住上次返 回時在函數(shù)體中的位置。對生成器第 二次(或n 次)調(diào)用跳轉(zhuǎn)至該函 次)調(diào)用跳轉(zhuǎn)至該函 數(shù)。
描述數(shù)組、鏈表、隊列、堆棧的區(qū)別?
數(shù)組與鏈表是數(shù)據(jù)存儲方式的概念,數(shù)組在連續(xù)的空間中存儲數(shù)據(jù),而鏈表可以在非連續(xù)的空間中存儲數(shù)據(jù);
隊列和堆棧是描述數(shù)據(jù)存取方式的概念,隊列是先進先出,而堆棧是后進先出;隊列和堆??梢杂脭?shù)組來實現(xiàn),也可以用鏈表實現(xiàn)。
你知道幾種排序,講一講你最熟悉的一種?
Python是如何進行內(nèi)存管理的
一、垃圾回收:
python不像C++,Java等語言一樣,他們可以不用事先聲明變量類型而直接對變量進行賦值。對Python語言來講,對象的類型和內(nèi)存都是在運行時確定的。這也是為什么我們稱Python語言為動態(tài)類型的原因(這里我們把動態(tài)類型可以簡單的歸結(jié)為對變量內(nèi)存地址的分配是在運行時自動判斷變量類型并對變量進行賦值)。
二、引用計數(shù):
Python采用了類似Windows內(nèi)核對象一樣的方式來對內(nèi)存進行管理。每一個對象,都維護這一個對指向該對對象的引用的計數(shù)。當(dāng)變量被綁定在一個對象上的時候,該變量的引用計數(shù)就是1,(還有另外一些情況也會導(dǎo)致變量引用計數(shù)的增加),系統(tǒng)會自動維護這些標簽,并定時掃描,當(dāng)某標簽的引用計數(shù)變?yōu)?的時候,該對就會被回收。
三、內(nèi)存池機制Python的內(nèi)存機制以金字塔行,-1,-2層主要有操作系統(tǒng)進行操作,
第0層是C中的malloc,free等內(nèi)存分配和釋放函數(shù)進行操作;
第1層和第2層是內(nèi)存池,有Python的接口函數(shù)PyMem_Malloc函數(shù)實現(xiàn),當(dāng)對象小于256K時有該層直接分配內(nèi)存;
第3層是最上層,也就是我們對Python對象的直接操作;
在C 中如果頻繁的調(diào)用 malloc 與 free 時,是會產(chǎn)生性能問題的.再加上頻繁的分配與釋放小塊的內(nèi)存會產(chǎn)生內(nèi)存碎片. Python 在這里主要干的工作有:
如果請求分配的內(nèi)存在1~256字節(jié)之間就使用自己的內(nèi)存管理系統(tǒng),否則直接使用 malloc.
這里還是會調(diào)用malloc 分配內(nèi)存,但每次會分配一塊大小為256k的大塊內(nèi)存.
經(jīng)由內(nèi)存池登記的內(nèi)存到最后還是會回收到內(nèi)存池,并不會調(diào)用 C 的 free 釋放掉.以便下次使用.對于簡單的Python對象,例如數(shù)值、字符串,元組(tuple不允許被更改)采用的是復(fù)制的方式(深拷貝?),也就是說當(dāng)將另一個變量B賦值給變量A時,雖然A和B的內(nèi)存空間仍然相同,但當(dāng)A的值發(fā)生變化時,會重新給A分配空間,A和B的地址變得不再相同
web框架部分
1.django 中當(dāng)一個用戶登錄 A 應(yīng)用服務(wù)器(進入登錄狀態(tài)),然后下次請求被 nginx 代理到 B 應(yīng)用服務(wù)器會出現(xiàn)什么影響?
如果用戶在A應(yīng)用服務(wù)器登陸的session數(shù)據(jù)沒有共享到B應(yīng)用服務(wù)器,納米之前的登錄狀態(tài)就沒有了。
2.跨域請求問題django怎么解決的(原理)
啟用中間件
post請求
驗證碼
表單中添加{%csrf_token%}標簽
3.請解釋或描述一下Django的架構(gòu)
對于Django框架遵循MVC設(shè)計,并且有一個專有名詞:MVT
M全拼為Model,與MVC中的M功能相同,負責(zé)數(shù)據(jù)處理,內(nèi)嵌了ORM框架
V全拼為View,與MVC中的C功能相同,接收HttpRequest,業(yè)務(wù)處理,返回HttpResponse
T全拼為Template,與MVC中的V功能相同,負責(zé)封裝構(gòu)造要返回的html,內(nèi)嵌了模板引擎
4.django對數(shù)據(jù)查詢結(jié)果排序怎么做,降序怎么做,查詢大于某個字段怎么做
排序使用order_by()
降序需要在排序字段名前加-
查詢字段大于某個值:使用filter(字段名_gt=值)
5.說一下Django,MIDDLEWARES中間件的作用?
答:中間件是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出。
你對Django的認識?
Django是走大而全的方向,它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象定義,它就能自動生成數(shù)據(jù)庫結(jié)構(gòu)、以及全功能的管理后臺。
Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高。
應(yīng)用程序必須使用Django內(nèi)置的ORM,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利;理論上可以切換掉其ORM模塊,但這就相當(dāng)于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。
Django的賣點是超高的開發(fā)效率,其性能擴展有限;采用Django的項目,在流量達到一定規(guī)模后,都需要對其進行重構(gòu),才能滿足性能的要求。
Django適用的是中小型的網(wǎng)站,或者是作為大型網(wǎng)站快速實現(xiàn)產(chǎn)品雛形的工具。
Django模板的設(shè)計哲學(xué)是徹底的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數(shù)據(jù)的可能。
Django重定向你是如何實現(xiàn)的?用的什么狀態(tài)碼?
使用HttpResponseRedirect
redirect和reverse
狀態(tài)碼:302,301
ngnix的正向代理與反向代理?
正向代理是一個位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端??蛻舳吮仨氁M行一些特別的設(shè)置才能使用正向代理。
反向代理正好相反,對于客戶端而言它就像是原始服務(wù)器,并且客戶端不需要進行任何特別的設(shè)置。客戶端向反向代理的命名空間中的內(nèi)容發(fā)送普通請求,接著反向代理將判斷向何處(原始服務(wù)器)轉(zhuǎn)交請求,并將獲得的內(nèi)容返回給客戶端,就像這些內(nèi)容原本就是它自己的一樣。
Tornado 的核是什么?
Tornado 的核心是 ioloop 和 iostream 這兩個模塊,前者提供了一個高效的 I/O 事件循環(huán),后者則封裝了 一個無阻塞的 socket 。通過向 ioloop 中添加網(wǎng)絡(luò) I/O 事件,利用無阻塞的 socket ,再搭配相應(yīng)的回調(diào) 函數(shù),便可達到夢寐以求的高效異步執(zhí)行。
Django 本身提供了 runserver,為什么不能用來部署?
runserver 方法是調(diào)試 Django 時經(jīng)常用到的運行方式,它使用 Django 自帶的
WSGI Server 運行,主要在測試和開發(fā)中使用,并且 runserver 開啟的方式也是單進程 。
uWSGI 是一個 Web 服務(wù)器,它實現(xiàn)了 WSGI 協(xié)議、uwsgi、http 等協(xié)議。注意 uwsgi 是一種通信協(xié)議,而 uWSGI 是實現(xiàn) uwsgi 協(xié)議和 WSGI 協(xié)議的 Web 服務(wù)器。uWSGI 具有超快的性能、低內(nèi)存占用和多 app 管理等優(yōu)點,并且搭配著 Nginx
就是一個生產(chǎn)環(huán)境了,能夠?qū)⒂脩粼L問請求與應(yīng)用app 隔離開,實現(xiàn)真正的部署 。相比來講,支持的并發(fā)量更高,方便管理多進程,發(fā)揮多核的優(yōu)勢,提升性能。
-
生成器
+關(guān)注
關(guān)注
7文章
315瀏覽量
21002 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
大數(shù)據(jù)
+關(guān)注
關(guān)注
64文章
8882瀏覽量
137394
原文標題:史上最全 python常見面試題(一)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論