一、歸併排序css
二、快速排序html
三、算法複雜度python
四、哈希表數據結構mysql
一、設計一個用戶關注系統的數據庫表,寫三個相關的SQL語句
兩張表,一張user表,一張relation表程序員
# 創建user表web
create table user(name varchar(30) not null)
# 創建relation表:uid--用戶ID,rid--用戶關注的人IDajax
create table relation(uid int not null,rid int not null)
# 1.查詢用戶a關注的人redis
select name from user where id in (select rid from relation where uid = a)
# 2.查詢關注用戶a的人算法
select name from user where id in (select uid from relation where rid = a)
# 3.查詢和a相互關注的人sql
select name from user where id in (select uid from relation where rid = a and uid in (select rid from relation where uid = a))
# 普通索引 INDEX index_emp_name (name) 或者 KEY index_dept_name (dept_name) # 惟一索引 UNIQUE INDEX index_emp_name (name) # 全文索引 FULLTEXT INDEX index_resume (resume) #多列索引(聯合索引) INDEX index_name_resume (name, resume) #CREATE在已存在的表上建立索引 CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(長度)] [ASC |DESC]) ; #ALTER TABLE在已存在的表上建立索引 ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX索引名 (字段名[(長度)] [ASC |DESC]) ; # 刪除索引 DROP INDEX index_emp_name on emp1
MySQL數 據庫引擎取決於MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須從新編譯MYSQL。在缺省狀況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也經常可使用。
ISAM:ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到 數據庫被查詢的次數要遠大於更新的次數。所以,ISAM執行讀取操做的速度很快,並且不佔用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不 支持事務處理,也不可以容錯:若是你的硬盤崩潰了,那麼數據文件就沒法恢復了。若是你正在把ISAM用在關鍵任務應用程序裏,那就必須常常備份你全部的實 時數據,經過其複製特性,MYSQL可以支持這樣的備份應用程序。
MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM裏所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個併發的讀寫操做,其代價是你須要常常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操做,這可能就是爲何MySQL受到了WEB開發如此青睞的主要緣由:在WEB開發中你所進行的大量數據操做都是讀取操做。因此,大多數虛擬主機提供商和INTERNET平臺提供商只容許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞後恢復數據。
HEAP:HEAP容許只駐留在內存裏的臨時表格。駐留在內存裏讓HEAP要比ISAM和MYISAM都快,可是它所管理的數據是不穩定的,並且若是在關機以前沒有進行保存,那麼全部的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你須要使用SELECT表達式來選擇和操控數據的時候很是有用。要記住,在用完表格以後就刪除表格。
InnoDB:InnoDB數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL++ API。在使用MYSQL的時候,你所面對的每個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理(transaction process)也不支持外來鍵。儘管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,若是你的設計須要這些特性中的一者 或者二者,那你就要被迫使用後兩個引擎中的一個了。
MySQL 官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具備提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級而且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特點增長了多用戶部署和性能。沒有在InnoDB中擴大鎖定的須要,由於在InnoDB中行級鎖定適合很是小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你能夠自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也能夠混合。
InnoDB是爲處理巨大數據量時的最大性能設計,它的CPU效率多是任何其它基於磁盤的關係數據庫引擎所不能匹敵的。
InnoDB存儲引擎被徹底與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池。InnoDB存儲它的表&索引在一個表空間中,表空間能夠包含數個文件(或原始磁盤分區)。這與MyISAM表不一樣,好比在MyISAM表中每一個表被存在分離的文件中。InnoDB 表能夠是任何尺寸,即便在文件尺寸被限制爲2GB的操做系統上。
InnoDB默認地被包含在MySQL二進制分發中。
InnoDB被用來在衆多須要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的
MyISAM適合:(1)作不少count 的計算;(2)插入不頻繁,查詢很是頻繁;(3)沒有事務。
InnoDB適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都至關的頻繁,而且表鎖定的機會比較大的狀況。
通常狀況下,MySQL會默認提供多種存儲引擎,能夠經過下面的查看:
(1)看你的MySQL如今已提供什麼存儲引擎: mysql> show engines;
(2)看你的MySQL當前默認的存儲引擎: mysql> show variables like '%storage_engine%';
(3)你要看某個表用了什麼引擎(在顯示結果裏參數engine後面的就表示該表當前用的存儲引擎): mysql> show create table 表名;
對mysql優化是一個綜合性的技術,主要包括
互聯網協議(Internet Protocol Suite)是一個網絡通訊模型,以及一整個網絡傳輸協議家族,爲互聯網的基礎通訊架構。它常被通稱爲TCP/IP協議族,簡稱TCP/IP。
TCP協議是面向鏈接,保證高可靠性(數據無丟失,數據無失序,數據無錯誤,數據無重複達到)
UDP:面向無鏈接的通信協議,不可靠的傳輸,數據丟失,無論數據包的順序、錯誤或重發(qq基於udp協議)
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型,是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議之上的一種應用。
HTTP鏈接最顯著的特色是:
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。
靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。
支持B/S及C/S模式。
https協議須要到CA申請證書,通常免費證書不多,須要交費。
http是超文本傳輸協議,信息是明文傳輸;https 則是具備安全性的ssl加密傳輸協 議。
http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據
客戶端先發送FIN,進入FIN_WAIT1狀態
服務端收到FIN,發送ACK,進入CLOSE_WAIT狀態,客戶端收到這個ACK,進入FIN_WAIT2狀態
服務端發送FIN,進入LAST_ACK狀態
客戶端收到FIN,發送ACK,進入TIME_WAIT狀態,服務端收到ACK,進入CLOSE狀態
域名解析 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 --> 服務器響應http請求,瀏覽器獲得html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶
HTTPS協議 = HTTP協議 + SSL/TLS協議,在HTTPS數據傳輸的過程當中,須要用SSL/TLS對數據進行加密和解密,須要用HTTP對加密後的數據進行傳輸,由此能夠看出HTTPS是由HTTP和SSL/TLS一塊兒合做完成的。
SSL的全稱是Secure Sockets Layer,即安全套接層協議,是爲網絡通訊提供安全及數據完整性的一種安全協議。SSL協議在1994年被Netscape發明,後來各個瀏覽器均支持SSL,其最新的版本是3.0。
TLS的全稱是Transport Layer Security,即安全傳輸層協議。在TLS與SSL3.0之間存在着顯著的差異,主要是它們所支持的加密算法不一樣,因此TLS與SSL3.0不能互操做。雖然TLS與SSL3.0在加密算法上不一樣,可是在咱們理解HTTPS的過程當中,咱們能夠把SSL和TLS看作是同一個協議。
dns是一個域名系統,是萬維網上做爲域名和IP地址相互映射的一個分佈式數據庫,可以使用戶更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP數串。
經過主機名,最終獲得該主機名對應的IP地址的過程叫作域名解析(或主機名解析)。在解析域名時,能夠首先採用靜態域名解析的方法,若是靜態域名解析不成功,再採用動態域名解析的方法,域名是互聯網上的身份標識,是不可重複的惟一標識資源; 互聯網的全球化使得域名成爲標識一國主權的國家戰略資源。
1 、DNS:域名系統DNS是因特網使用的命名系統,用來把便於人們使用的機器名字轉換爲IP地址。
如今頂級域名TLD分爲三大類:國家頂級域名nTLD;通用頂級域名gTLD;基礎結構域名
域名服務器分爲四種類型:根域名服務器;頂級域名服務器;本地域名服務器;權限域名服務器。
二、FTP:文件傳輸協議FTP是因特網上使用得最普遍的文件傳送協議。FTP提供交互式的訪問,容許客戶指明文件類型與格式,並容許文件具備存取權限。FTP其於TCP。
三、telnet遠程終端協議:telnet是一個簡單的遠程終端協議,它也是因特網的正式標準。又稱爲終端仿真協議。
四、HTTP:超文本傳送協議,是面向事務的應用層協議,它是萬維網上可以可靠地交換文件的重要基礎。http使用面向鏈接的TCP做爲運輸層協議,保證了數據的可靠傳輸。
五、電子郵件協議SMTP:即簡單郵件傳送協議。SMTP規定了在兩個相互通訊的SMTP進程之間應如何交換信息。SMTP通訊的三個階段:創建鏈接、郵件傳送、鏈接釋放。
6 、POP3:郵件讀取協議,POP3(Post Office Protocol 3)協議一般被用來接收電子郵件。
一、併發:系統具備處理多個任務的能力;
二、並行:系統具備同時處理多個任務的能力;並行是併發的子集;
三、同步:當進程執行到一個IO(等待外部數據)的時候,必須等待;好比打電話,一直等到對方接聽;
四、異步:當進程執行到一個IO(等待外部數據)的時候,不等待,直到數據接收成功,再回來處理;好比發短信,不須要等到對方回覆,能夠先去作別的,收到後再來回復短信;
五、IO多路複用:監聽多個socket對象(while循環),誰有變化就處理誰,利用這個特性,能夠開發出不少操做,好比異步IO模塊;
六、異步IO:當進程執行到一個IO(等待外部數據)的時候,不等待,直到數據接收成功,再回來處理,其實就是回調;
七、利用非阻塞的socket+IO多路複用,能夠實現僞併發;
八、協程:
線程和進程的操做是由程序觸發系統接口,最後的執行者是系統;協程的操做則是程序員;
協程存在的意義:對於多線程應用,CPU經過切片的方式來切換線程間的執行,線程切換時須要耗時(保存狀態,下次繼續)。協程,則只使用一個線程,在一個線程中規定某個代碼塊執行順序。
協程的適用場景:當程序中存在大量不須要CPU的操做時(IO),適用於協程,即高併發的io操做,協程比多線程節省時間;
九、線程
一個應用程序能夠有多進程、多線程;默認是單進程、單線程;
每個進程有一個全局解釋器鎖(GIL),每一次CPU調用只能調用一條線程;
若是是IO操做,不佔用CPU,單進程,多線程能夠提升併發;
若是是計算型操做,佔用CPU,多進程提升併發;
十、線程鎖:因爲線程之間是進行隨機調度,當多個線程同時修改同一條數據時可能會出現髒數據,因此出現了線程鎖,同一時刻只容許一個線程執行操做
十一、進程
進程本質上就是一個程序運行的過程;進程通常由程序、數據集、進程控制塊三部分組成;
一個程序至少有一個進程,一個進程至少有一個線程;
進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源. 一個線程能夠建立和撤銷另外一個線程;同一個進程中的多個線程之間能夠併發執行。
用一個遞增的數字去維護數據庫,只須要把數字轉換成字母的編碼格式,就能獲得相應的key,而後再把value存成長連接,就實現了短連接和長連接的對應關係。
經過發號策略,給每個過來的長地址,發一個號便可,小型系統直接用mysql的自增索引就搞定了。若是是大型應用,能夠考慮各類分佈式key-value系統作發號器。不停的自增就好了。第一個使用這個服務的人獲得的短地址是 http://xx.xx/0 第二個是 http://xx.xx/1 第11個是 http://xx.xx/a 第依次日後,至關於實現了一個62進制的自增字段便可。
其實咱們並不須要在存儲中用62進制,用10進制就行了。好比第10000個長地址,咱們給它的短地址對應的編號是9999,咱們經過存儲自增拿到9999後,再作一個10進制到62進制的轉換,轉成62進制數便可。這個10~62進制轉換,你徹底均可以本身實現。
用key-value存儲,保存「最近」生成的長對短的一個對應關係。注意是「最近」,也就是說,我並不保存全量的長對短的關係,而只保存最近的。好比採用一小時過時的機制來實現LRU淘汰。
這樣的話,長轉短的流程變成這樣:
因此當一個地址被頻繁使用,那麼它會一直在這個key-value表中,總能返回當初生成那個短地址,不會出現重複的問題。若是它使用並不頻繁,那麼長對短的key會過時,LRU機制自動就會淘汰掉它。
固然,這不能保證100%的同一個長地址必定能轉出同一個短地址,好比你拿一個生僻的url,每間隔1小時來轉一次,你會獲得不一樣的短地址。可是這真的有關係嗎?
上面設計看起來有一個單點,那就是發號器。若是作成分佈式的,那麼多節點要保持同步加1,多點同時寫入,這個嘛,以CAP理論看,是不可能真正作到的。其實這個問題的解決很是簡單,咱們能夠退一步考慮,咱們是否能夠實現兩個發號器,一個發單號,一個發雙號,這樣就變單點爲多點了?依次類推,咱們能夠實現1000個邏輯發號器,分別髮尾號爲0到999的號。每發一個號,每一個發號器加1000,而不是加1。這些發號器獨立工做,互不干擾便可。並且在實現上,也能夠先是邏輯的,真的壓力變大了,再拆分紅獨立的物理機器單元。1000個節點,估計對人類來講應該夠用了。若是你真的還想更多,理論上也是能夠的。
301是永久重定向,302是臨時重定向。短地址一經生成就不會變化,因此用301是符合http語義的,同時對服務器壓力也會有必定減小。
可是若是使用了301,咱們就沒法統計到短地址被點擊的次數了。而這個點擊次數是一個很是有意思的大數據分析數據源。可以分析出的東西很是很是多。因此選擇302雖然會增長服務器壓力,可是我想是一個更好的選擇。
Memcache 是一個開源、高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。它能夠應對任意多個鏈接,使用非阻塞的網絡IO。因爲它的工做機制是在內存中開闢一塊空間,而後創建一個存儲鍵/值對的HashTable,Memcache這個軟件項目通常叫Memcache,但項目的主程序文件叫memcached.exe(字母d能夠理解爲daemon),是靠服務端的這個守護進程管理這些HashTable。因爲這個命名問題,因此不少人把這個軟件系統叫memcache,想叫成memcached也沒什麼問題!其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。
redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。
(1) 速度快,由於數據存在內存中,相似於HashMap,HashMap的優點就是查找和操做的時間複雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash,memcached全部的值均是簡單的字符串
(3) 支持事務,操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過時時間,過時後將會自動刪除
1)、存儲方式 Memecache把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,這樣能保證數據的持久性。
2)、數據支持類型 Memcache對數據類型支持相對簡單。 Redis有複雜的數據類型。
3)value大小 redis最大能夠達到1GB,而memcache只有1MB
(1) Master最好不要作任何持久化工做,如RDB內存快照和AOF日誌文件
(2) 若是數據比較重要,某個Slave開啓AOF備份數據,策略設置爲每秒同步一次
(3) 爲了主從複製的速度和鏈接的穩定性,Master和Slave最好在同一個局域網內
(4) 儘可能避免在壓力很大的主庫上增長從庫
(5) 主從複製不要用圖狀結構,用單向鏈表結構更爲穩定,即:Master <- Slave1 <- Slave2 <- Slave3... 這樣的結構方便解決單點故障問題,實現Slave對Master的替換。若是Master掛了,能夠馬上啓用Slave1作Master,其餘不變。
(1)、會話緩存(Session Cache)
(2)、全頁緩存(FPC)
(3)、隊列
(4),排行榜/計數器
(5)、發佈/訂閱
分表分庫,小圖片規整,css/js合併壓縮,Redis緩存熱點數據,使用瀏覽器的緩存功能
首先,能夠調整webserver配置,修改頁面響應時間的參數,延長timeout時間
第二,採用異步方式加載,就是ajax,請求時傳遞參數到後臺,頁面顯示等待信息,等後臺處理完成返回結果再展現
第三,優化你的程序或sql,找出慢的緣由,數據量大隻是一個方面,不少大型數據庫用的時候也不會慢到哪裏去
一、Sql 依賴緩存
對於全部用戶讀到相同結果的數據,改成從內存中讀取,減小數據庫訪問的次數,下降數據庫CPU的壓力,但會提升Web服務器的一些壓力,和增長少許的內存佔用量。
二、頁面緩存、控件緩存的技巧
對於全部用戶獲得相同頁面結果的頁面來講,能夠採用頁面緩存的方式,好比咱們在首頁上展現公告信息的結果,這些結果對於全部用戶來講是同樣的,能夠採用頁面緩存的方式,同時經過設置頁面緩存的失效機制保證全部用戶獲得最新的結果,好比後臺代碼增長新的公告內容時能夠設置一個Application的值,告訴頁面緩存失效。
三、智能的靜態頁面處理技巧
一些已經處理完成的頁面展現的時候,系統已經再也不有交互的動做,對於用戶來講,僅僅只是查看結果的狀況下,能夠智能的生成靜態頁面文件,只有一個用戶是經過.NET計算去得到展現,其它用戶訪問的則是生成的靜態頁面,這樣也能夠減小很是大數據量的.NET計算,提升性能。 好比E8.Net工做流平臺中展現流程結束後的結果就有客戶使用到了這些技巧,大大減小了服務器的壓力。
class Person(object): """Silly Person""" def __new__(cls, name, age): print '__new__ called.' return super(Person, cls).__new__(cls, name, age) def __init__(self, name, age): print '__init__ called.' self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if name == 'main': piglei = Person('piglei', 24) print piglei 執行結果: piglei@macbook-pro:blog$ python new_and_init.py new called. init called. <Person: piglei(24)>
經過運行這段代碼,咱們能夠看到,new方法的調用是發生在init以前的。其實當 你實例化一個類的時候,具體的執行邏輯是這樣的:
1.p = Person(name, age)
2.首先執行使用name和age參數來執行Person類的new方法,這個new方法會 返回Person類的一個實例(一般狀況下是使用 super(Persion, cls).new(cls, ... ...) 這樣的方式),
3.而後利用這個實例來調用類的init方法,上一步裏面new產生的實例也就是 init裏面的的 self
因此,init 和 new 最主要的區別在於:
1.init 一般用於初始化一個新實例,控制這個初始化的過程,好比添加一些屬性, 作一些額外的操做,發生在類實例被建立完之後。它是實例級別的方法。
2.new 一般用於控制生成一個新實例的過程。它是類級別的方法。
可是說了這麼多,new最一般的用法是什麼呢,咱們何時須要new?依照Python官方文檔的說法,new方法主要是當你繼承一些不可變的class時(好比int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現自定義的metaclass。
一、繼承自object的新式類纔有__new__
二、__new__至少要有一個參數cls,表明當前類,此參數在實例化時由Python解釋器自動識別
三、__new__必需要有返回值,返回實例化出來的對象,這點在本身實現__new__時要特別注意,能夠return父類(經過super(當前類名, cls))__new__出來的實例,或者直接是object的__new__出來的實例
四、__init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上能夠完成一些其它初始化的動做,__init__不須要返回值
五、若是__new__建立的是當前類的實例,會自動調用__init__函數,經過return語句裏面調用的__new__函數的第一個參數是cls來保證是當前類實例,若是是其餘類的類名,;那麼實際建立返回的就是其餘類的實例,其實就不會調用當前類的__init__函數,也不會調用其餘類的__init__函數。
優勢:
1.簡潔易懂
2.跨平臺
3.可擴展性
可移植性
既支持面向過程的函數編程也支持面向對象的抽象編程
豐富的標準庫和第三方庫
缺點:
Python 的執行速度不夠快,和C相差五倍,若是是大規模計算問題,大約能差10倍以上,python的效率問題也不是技術緣由致使的,並且python也對這方面有所彌補,那就是對效率敏感的地方能夠用C重寫,以達到預期的效率需求,可是治標不治本,追求python的高開發效率的同時,就得捨棄一些性能上的追求。
全局解釋器鎖GIL(Global Interpreter Lock),致使計算密集型任務效率低下;以致於我如今對高併發計算都採起多進程的模式。多進程模式的通信效率確定比多線程低,並且麻煩。
解釋性語言和編譯型語言的區別:
1.編譯型語言在程序執行以前,有一個單獨的編譯過程,將程序翻譯成機器語言,之後執行這個程序的時候,就不用再進行翻譯了。
2.解釋型語言,是在運行的時候將程序翻譯成機器語言,因此運行速度相對於編譯型語言要慢。
3.C/C++ 等都是編譯型語言,而Java,C#等都是解釋型語言。