1.看代碼html
解釋:python
字典是可變對象,在下方的 l.append(a)的操做中是把字典 a 的引用傳到列表 l 中,當後續操做修改 a[‘num’]的值的時候,l 中的值也會跟着改變,至關於淺拷貝。
2. 4G 內存怎麼讀取一個 5G 的數據?linux
方法一: 能夠經過生成器,分屢次讀取,每次讀取數量相對少的數據(好比 500MB)進行處理,處理結束後在讀取後面的 500MB 的數據。 方法二: 能夠經過 linux 命令 split 切割成小文件,而後再對數據進行處理,此方法效率比較高。能夠按照行數切割,能夠按照文件大小切割。
3.輸入某年某月某日,判斷這一天是這一年的第幾天?redis
import datetime def day_of_year(): year = input("年份:") month = input("月份:") day = input("天:") date1 = datetime.date(year=int(year),month=int(month),day=int(day)) date2 = datetime.date(year=int(year),month=1,day=1) return (date1-date2).days + 1 print(day_of_year())
4. os.path 和 sys.path 分別表明什麼算法
os.path 主要是用於對系統路徑文件的操做。 sys.path 主要是對 Python 解釋器的系統環境參數的操做(動態的改變 Python 解釋器搜索路徑)。
5.模塊和包的區別數據庫
python中,模塊是搭建程序的一種方式,每個Python代碼文件都是一個模塊,並能夠引用其餘模塊,好比對象和屬性 一個包含許多 Python 代碼的文件夾是一個包。一個包能夠包含模塊和子文件夾
6.對字典d = {'a':24,'g':52,'i':12,'k':33}的values進行排序django
d = {'a':24,'g':52,'i':12,'k':33} temp = sorted(d.items(),key=lambda x:x[1]) print(temp) from operator import itemgetter sorted_ed = sorted(d.items(), key=itemgetter(1)) print(sorted_ed)
7.分析下列三個函數執行效率大小編程
利用程序分析包分析代碼性能設計模式
import random import cProfile lIn = [random.random() for i in range(100**3)] # 隨機賦值,值越大越明顯 cProfile.run('f1(lIn)') cProfile.run('f2(lIn)') cProfile.run('f3(lIn)')
利用裝飾器分析執行性能瀏覽器
import time def outter(func): def inner(*args): beign = time.time() func(*args) use_time = time.time()-beign print(use_time) return inner @outter # f1=outter(f1)(lIn) def f1(lIn): l1 = sorted(lIn) l2 = [i for i in l1 if i<0.5] return [i*i for i in l2] @outter def f2(lIn): l1 = [i for i in lIn if i<0.5] l2 = sorted(l1) return [i*i for i in l2] @outter def f3(lIn): l1 = [i*i for i in lIn] l2 = sorted(l1) return [i for i in l2 if i<(0.5**0.5)] import random temp = [random.random() for i in range(100000)] f1(temp) f2(temp) f3(temp)
8.python內存管理機制
內存管理機制:引用計數,垃圾回收,內存池
應用計數制:python內部使用應用計數,來保持追蹤內存中的對象,全部對象都有引用計數;
垃圾回收機制:當一個對象的引用計數爲0的時候,它將會被垃圾回收機制處理;
內存池機制:python提供了對內存的垃圾收集機制,它將不用的內存放到內存池而不是返回給操做系統
垃圾回收機制:引用計數,標記清除,分代回收
9.filter、map、reduce的做用?
1:Map:主要包括兩個參數,函數和列表。 將函數的結果以列表的形式返回。
會將一個函數映射到一個輸入列表的全部元素。
規範:map(lambda x: x * x,[y for y in range(3)])
大多數時候,咱們要把列表中的全部元素一個個的傳遞給一個函數,並收集輸出。
2:Filter:包括兩個參數function,list。根據function的返回值是True, 來過濾list的參數中的項,最後返回結果。
過濾列表中的元素,而且返回一個由全部符合要求的元素構成的列表。
符合要求 即函數映射到該元素時返回值爲True.
3: Reduce:從列表中取出頭兩個元素並傳遞到一個二元函數中去, 求出值,再添加到序列中繼續循環下一個值,直到最後一個值。
當須要對一個列表進行計算並返回結果時,reduce是一個頗有用的函數。
例:當你須要計算一個整數列表的乘積時。一般在python中,你可能會使用基本的for循環來完成任務。
10.什麼是可變,不可變類型?
11. 1,2,3,4,5能夠組成多少個互不相同且不重複的三位數?
使用python內置的排列組合函數itertools(不放回抽樣排列)
product 笛卡爾積 (有放回抽樣排列)
permutations 排列 (不放回抽樣排列)
combinations 組合,沒有重複 (不放回抽樣組合)
combinations_with_replacement 組合,有重複 (有放回抽樣組合)
import itertools goal = list(itertools.permutations('12345',3)) print(goal) # 返回全部結果
12.metaclass的做用:
1.手寫一個單例模式,或者經過裝飾器實現一個單例模式
2.單例模式應用場景有哪些?
資源共享的狀況下,避免因爲資源操做時致使的性能或損耗等。如日誌文件,應用配置
控制資源的狀況下,方便資源之間的互相通訊。如線程池等
3.函數裝飾器的做用?
讓其餘函數在不須要作任何代碼的變更的前提下增長額外的功能
如:插入日誌、性能測試、事務處理、緩存、權限的校驗等場景
4.談談對面向對象的理解?
面向對象是相對於面向過程而言的
面向過程是一種基於功能分析的,以算法爲中心的程序設計方法
面向對象是一種基於結構,以數據爲中心的程序設計思想
1. 談談你對多進程,多線程,以及協程的理解,項目是否用?
進程:一個運行的程序(代碼)就是一個進程,進程是系統資源分配的最小單位。進程都擁有本身獨立的內存空間,之間數據不共享,開銷大
線程:調度執行的最小單位,也叫執行路徑,不能獨立存在,一個進程至少有一個線程,叫主線程。多個線程之間共享內存(數據共享,全局變量共享),從而極大提升了程序的運行效率
協程:用戶態的輕量級線程,協程的調度徹底由用戶控制。協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快
2.什麼是線程競爭?
線程是非獨立的,同一個進程裏線程是數據共享的,當各個線程訪問數據資源時會出現競爭狀態即:數據幾乎同步會被多個線程佔用,形成數據混亂 ,即所謂的線程不安全那麼解決多線程競爭利用了鎖。
鎖的好處:確保某段共享數據資源只能由一個線程從頭至尾完整執行
鎖的壞處:阻止了線程併發執行。包含鎖定某段代碼實際只能以單線程模式執行,效率下降
鎖的致命問題:死鎖
3.死鎖概念?
若干子線程在系統資源競爭時,都在等待對方對某部分資源解除佔用狀態,結果是誰也不肯先解鎖,互相干等着,程序沒法執行下去,這就是死鎖。
4.GIL鎖?
GIL 鎖:全局解釋器鎖(只在 cpython 裏纔有)
做用:限制多線程同時執行,保證同一時間只有一個線程執行,因此 cpython 裏的多線程實際上是僞多線程
5.進程和線程的使用場景?
多進程適合在 CPU 密集型操做(cpu 操做指令比較多,如位數多的浮點運算)。
多線程適合在 IO 密集型操做(讀寫數據操做較多的,好比爬蟲)。
6.請簡述瀏覽器是如何獲取一枚網頁的?
1.在用戶輸入目的 URL 後,瀏覽器先向 DNS 服務器發起域名解析請求
2.在獲取了對應的 IP 後向服務器發送請求數據包
3.服務器接收到請求數據後查詢服務器上對應的頁面,並將找到的頁面代碼回覆給客戶端
4.客戶端接收到頁面源代碼後,檢查頁面代碼中引用的其餘資源,並再次向服務器請求該資源
5.在資源接收完成後,客戶端瀏覽器按照頁面代碼將頁面渲染輸出顯示在顯示器上
7.cookie和session的區別?
1.cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上
2.cookie 不是很安全,別人能夠分析存放在本地的 cookie 並進行 cookie 欺騙考慮到安全應當使用session
3.session 會在必定時間內保存在服務器上。當訪問增多,會比較佔用服務器的性能考慮到減輕服務器性能方面,應當使用 cookie
4.單個 cookie 保存的數據不能超過 4K,不少瀏覽器都限制一個站點最多保存 20 個 cookie
5.將登錄信息等重要信息存放爲 SESSION 其餘信息若是須要保留,能夠放在 cookie 中
8.說說 HTTP 和 HTTPS 區別?
HTTP 協議傳輸的數據都是未加密的,也就是明文的,所以使用 HTTP 協議傳輸隱私信息很是不安全,爲了保證這些隱私數據能加密傳輸,因而網景公司設計了 SSL(Secure Sockets Layer)協議用於對 HTTP 協議傳輸的數據進行加密,從而就誕生了 HTTPS。簡單來講,HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網絡協議,要比 http 協議安全。
主要區別:
1.https 協議須要到 ca 申請證書,通常免費證書較少,於是須要必定費用。
2.http 是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的 ssl 加密傳輸協議。
3.http 和 https 使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是 80,後者是 443。
4.http 的鏈接很簡單,是無狀態的;HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網絡協議,比 http 協議安全。
1.優化算法時間複雜度
2.減小冗餘數據
3.合理使用深淺拷貝
4.使用dict和set查找元素
5.合理使用生成器和yield
6.循環的優化
7.優化多個判斷表達式的順序
8.使用join合併迭代器中的字符串
9.使用合適的格式化字符串方式
10.不借用中間變量交換連個兩個變量的值
數據庫優化方案:
一、建立數據表時把固定長度的放在前面()
二、將固定數據放入內存: 例如:choice字段 (django中有用到,數字一、二、3…… 對應相應內容)
三、char 和 varchar 的區別(char可變, varchar不可變 )
四、聯合索引遵循最左前綴(從最左側開始檢索)
五、避免使用 select *
六、讀寫分離 - 實現:兩臺服務器同步數據
- 利用數據庫的主從分離:主,用於刪除、修改、更新;從,用於查; 讀寫分離:利用數據庫的主從進行分離:主,用於刪除、修改更新;從,用於查
七、分庫 - 當數據庫中的表太多,將某些表分到不一樣的數據庫,例如:1W張表時
- 代價:連表查詢
八、分表
- 水平分表:將某些列拆分到另一張表,例如:博客+博客詳情
- 垂直分表:講些歷史信息分到另一張表中,例如:支付寶帳單
九、加緩存
- 利用redis、memcache (經常使用數據放到緩存裏,提升取數據速度)
若是隻想獲取一條數據:
- select * from tb where name=‘alex’ limit 1