Python的定位?
Python與Java各自適合的場景是什麼樣的?有什麼不同定位?
我以我的用Python做出來的東西來說吧
##搭建網站後台
我曾經使用JSP寫網站後台,非常痛苦難受,總之感覺繼續學下去我就要轉行那種感覺,然後我接觸了Python,因為其他的大項目還沒推出,附上自己建的個人博客吧,基於Pythonhttp://aljun.me##寫爬蟲
Python寫爬蟲的酸爽簡直難以置信,首先本來他對網路訪問支持就非常好,然後爬蟲庫如scrapy,pyspider,requests(這個好像不能算爬蟲庫)之類的寫爬蟲溜得飛起啊##科學計算當時我是要做數學建模大賽,除了我以外基本上所有人都選擇使用MATLAB,但我還是使用Python那三件套(matplotlib,nunpy,scipy),加上使用Python讀取題目給的excel數據,然後Python代碼又非常直觀,讀起來和英文一樣,我兩個不懂計算基的隊友都能很快看懂我是不是用代碼表達了他們的想法這個問題已經有了十八個回答,除了發廣告的,其他答主都在從很高的角度去進行分析,編程哲學、性能劣勢甚至還有說到CPU的,作為一個小白我看的是一頭霧水。
兩三年前,我曾經粗淺的接觸到一點Python知識,如今正在系統學習,我就從一個編程初學者的角度來做一下分析吧。
Python作為編程語言,到底是一個什麼樣的存在?膠水、簡單、粘合劑、易用、速度等通常是這門語言的關鍵詞。 著名的自由軟體作者Eric Raymond在他的文章《如何成為一名黑客》中,將Python列為黑客應當學習的四種編程語言之一,並建議人們從Python開始學習編程。
從我學習的經驗來看,Python語法比較簡單,掌握起來難度不大,一些簡單內容聽一下視頻就可以自己動手複製, 即使稍微有些難度的問題,搜索引擎也可以很簡單的給出答案。
所以,結論一:Python是一門非常簡單、適合新手入門的語言。
Python可以做很多事情,目前全棧培訓班都會選擇Python作為主要授課語言(雖然效果存疑),這無疑表明了Python的多面手屬性。
如果你有興趣,Python可以用來做大數據、機器學習、人工智慧,你可以用它寫爬蟲、寫網站、寫自動化腳本寫一堆你想寫的東西。
可以參考這個問題:大家都用 Python 來做什麼啊?
裡面一些答主的腦洞真的讓人嘆為觀止。
所以,結論二:Python是一門應用非常廣泛、前後端都能涉及的語言。
大家都知道,通常來講一門編程語言的應用範圍是有限的,那為什麼Python可以做這麼多事情?
膠水語言可不是白叫的!Python 擁有一個強大的基本類庫和數量眾多的第三方擴展庫,這些內容讓使用Python的同學省下很多功夫。比如說,想要做一個爬蟲,直接上scrapy,其他同理。這種情況讓大家無需研究一些底層知識,從而節省了大量時間。
正因為如此,Python程序員往往可以很高效的解決問題,但大部分時間都是知其然不知其所以然——有句話說Python程序員用的最多的不是IDE,而是Google(其實是我們老師說的)。
所以,結論三:Python是一門不容易走向精通的語言,需要自己去努力研究。
最後答主再放一條未經過本人驗證的結論:據說Python的運行速度比較慢。但是我剛剛入門,對於Python體會不深,其他語言還沒有接觸過。從我個人的角度來看,犧牲一點運行速度換來編程效率大幅度提升,我個人認為是很值的。
所以,總的結論就是:人生苦短,我用Python。
python能做什麼?
1, 網站業務邏輯的開發
python有一個優良的網頁開發框架django, django支持各種主流資料庫,有好用的orm系統和模板系統,完善的第三方庫能幫助解決遇到的大部分問題。 並且支持各種操作系統。2, 數據分析和科學計算
python有numpy,scipy等一大批科學計算庫,有pandas數據分析庫 還有matplotlib等繪圖庫,在科學計算和數據分析領域已經成為主流語言3, 網路爬蟲
scrapy做為python實現的爬蟲庫,被廣泛使用,同時python還擁有beatifulsoup, pyquery等html解析庫 requests網路庫可以用來做爬取和分析用途。4, 自動化運維
主流的操作系統都集成有python, 同時自動化運維領域主流技術棧 saltstack和ansible也是基於python技術開發。可以使用python打造強大的自動化運維工具。java能做什麼?
1 大數據分析
java擁有完整的大數據技術體系,包括但不限於hadoop, hbase, spark, storm 用來處理海量數據。2 分散式集群
java有大量功能完善的分散式服務中間件,避免重新開發此類服務。 這些中間件包括zookeeper, kafka, hdfs等等3 搜索引擎
搜索引擎目前也是java一家獨霸, java 的elasticsearch是目前最好的開源搜索引擎,此外圍繞elasticsearch的elk日誌分析工具也已經形成了生態鏈 發揮著越來越多的用途。所以從上述分析可以看出,python更適合用在創業開發或者對業務變化需求非常高的公司。而java更適合對業務要求穩定, 並且有海量數據需要處理的公司!1 python如何定位這麼一個元素:
快來操作
沒有id,沒有name,沒有class,xpath的話這玩意是隨機生成的row路徑,無法定位
&快來操作&
# _*_ coding:utf-8 _*_
from bs4 import BeautifulSoup
res =&快來操作&
soup = BeautifulSoup(res)
#print soup
lt=soup.find(attrs = {style:padding: 5px; text-align: center; width: 715px; text-overflow: ellipsis; overflow: hidden;})
print lt
print lt.contents #獲取他的內容 [「快來操作」]
最後我有建立一個python學習交流群,在群里我們相互幫助,相互關心,相互分享內容,這樣出問題幫助你的人就比較多,群號是483,還有546,最後是416,這樣就可以找到大神聚合的群,如果你只願意別人幫助你,不願意分享或者幫助別人,那就請不要加了,你把你會的告訴別人這是一種分享。
python很適合非科班出身的人使用。 貼合自然語言。
關鍵有很多可以使用的第三方庫! 這樣避免了重複做輪子 !對於一些實用的項目,python可以很快就能夠做出來。
玄魂工作室--Coding - 知乎專欄 正在做關於python的教程,可以關注最新文章
- 不後悔一時衝動,因為收穫太多感動這是關於此話題的第二篇,也是最後一篇,說多了就矯情了!昨天,有一點衝動,破天荒的發了一篇抱怨的文章《我免費發布的… 查看全文玄魂工作室-玄魂 · 27 分鐘前1 贊 · 1 條評論
- Python黑帽編程2.7 異常處理Python黑帽編程2.7 異常處理異常是個很寬泛的概念,如果程序沒有按預想的執行,都可以說是異常了。遇到一些特殊情況沒處… 查看全文玄魂工作室-玄魂 · 12 小時前6 贊
- 我免費發布的東西,你拿去賣錢,我不平衡2016-08-11 玄魂工作室-玄魂 一年多前,錄了一套 Kali Linux web滲透測試--初級教程(23課時)。當時發布在51cto在線教… 查看全文
玄魂工作室-玄魂 · 1 天前
191 贊 · 40 條評論 - 如何學python-第十五課 linux下的python腳本編程今天我們不講具體的python技巧。今天講講在linux下,從腳本創建到執行的過程。如果需要看win下的,可以留言,我會再做一… 查看全文李三思 · 1 天前15 贊 · 5 條評論
- 玄魂工作室--咪嚕妹啦啦啦~最近是不是都被這個運動員妹紙的表情包刷屏了呢;這麼歡脫的妹紙在運動界堪稱一股清新的「泥石流」~讓我們為我國… 查看全文玄魂工作室-玄魂 · 3 天前3 贊 · 8 條評論
- Python黑帽編程2.6 模塊我們已經學習了如何在你的程序中定義一次函數而重用代碼。如果你想要在其他程序中重用很多函數,那麼你該如何編寫程序呢… 查看全文玄魂工作室-玄魂 · 3 天前
9 贊 · 1 條評論
- 如何學python-第十四課 lambda及其使用上節課我們介紹了一些列表的高級使用方法。在本節,我們更進一步,討論一下lambda和它的一些使用。(嗯,我不會討論戈登… 查看全文李三思 · 3 天前19 贊 · 5 條評論
- 單身狗,你並不孤單今天是七夕,互聯網上一片虐狗的言論。但我是個善良人,我想給單身狗帶來一點精神上的慰藉,即便是孤單,也要優雅,更何… 查看全文玄魂工作室-玄魂 · 4 天前25 贊 · 15 條評論
- 每周一書-2016年8月9日很高興今天收到電子工業出版社的美女編輯 安娜 的贈書:(3本),這是幾本今年剛出的新書,我們也會重點宣傳一下,優先對外贈送。這裡先透露一下,下周會贈送Bootstrap這本書,想要的小夥伴… 查看全文玄魂工作室-玄魂 · 4 天前1 贊 · 2 條評論
- 如何學python-第十三課 列表進階-切片 列表推導式歡迎回來。在上一節課,我們學習了邏輯運算符和成員運算符。按照慣例,這節課我們講點其他的東西,換換腦筋。本節課我們… 查看全文李三思 · 4 天前5 贊
- Python黑帽編程2.5 函數寫了幾節的基礎知識,真心感覺有點力不從心。這塊的內容說實話,看文檔是最好的方式,本人的寫作水平,真的是找不出更好… 查看全文玄魂工作室-玄魂 · 4 天前24 贊 · 2 條評論
- 每周一書計劃-2016.8.8每周一書計劃雖然現在互聯網上的知識足夠豐富,雖然搜索引擎足夠強大,雖然我們大部分時間都被碎片化,但是在這個煩亂、… 查看全文玄魂工作室-玄魂 · 5 天前20 贊 · 9 條評論
- 如何學python-第十二課 邏輯運算符-成員運算符上一節我們介紹了元組和字典。這節課我們討論點別的換換腦筋,聊聊邏輯運算符和成員運算符(有些人也把這個翻譯成身份運… 查看全文李三思 · 5 天前10 贊 · 3 條評論
- Python黑帽編程2.4 流程式控制制本節要介紹的是Python編程中和流程式控制制有關的關鍵字和相關內容。2.4.1 IF …..ELSE 先上一段代碼:#!/usr/bin/python # … 查看全文玄魂工作室-玄魂 · 5 天前7 贊
- 如何學python-第十一課 元組與字典歡迎回來。上一期的如何學python里,我們討論了函數。我們今天將要學習的是兩種類似於列表(list)類型的數據類型。我們先… 查看全文李三思 · 7 天前3 贊 · 2 條評論
- 如何學python-第十課 函數在上一節課里,我們學習了一些關於錯誤檢測和錯誤處理的知識。這節課我們來學習函數。我們將會介紹什麼是函數,以及如何… 查看全文李三思 · 9 天前11 贊 · 2 條評論
- Python黑帽編程2.3 字元串、列表、元組、字典和集合本節要介紹的是Python裡面常用的幾種數據結構。通常情況下,聲明一個變數只保存一個值是遠遠不夠的,我們需要將一組或多… 查看全文玄魂工作室-玄魂 · 9 天前15 贊 · 5 條評論
- 如何學python-第九課 tryexcept-錯誤與異常人非聖賢,孰能無過?寫程序的時候難免會遇到一些問題。本篇文章會介紹一些寫程序時常見的錯誤,並解釋一下其中的道理。… 查看全文李三思 · 9 天前7 贊 · 8 條評論
- Python黑帽編程2.2 數值類型數值類型,說白了就是處理各種各樣的數字,Python中的數值類型包括整型、長整型、布爾、雙精度浮點、十進位浮點和複數,… 查看全文玄魂工作室-玄魂 · 10 天前2 贊 · 3 條評論
- 2016阿里安全峰會重點資料下載風聲與暗算,無中又生有:威脅情報應用的那些事兒內容整理:https://yq.aliyun.com/articles/57700PDF下載:· Webs… 查看全文玄魂工作室-玄魂 · 10 天前32 贊 · 2 條評論
- 如何學python-第八課 流程式控制制-For,While,循環語句,初見『函數』循環語句也許你會問,什麼是『循環』?在腳本程序里,循環就是『在一定情況下一次又一次的執行某些代碼』。舉個例子來說… 查看全文李三思 · 10 天前7 贊 · 4 條評論
- 如何學python-第七課 列表型變數 列表方法 列表索引在上一篇文章里,我們介紹了if語句、elif語句和else語句以及條件判斷語句。我們今天來說點流程式控制制之外的東西:列表。列… 查看全文李三思 · 10 天前17 贊 · 5 條評論
- 2016烏雲白帽資料下載2016烏雲白帽資料下載鏈接: http://pan.baidu.com/s/1mhEENcG 密碼: 7g57· 問題討論請加qq群:Hacking (1群… 查看全文玄魂工作室-玄魂 · 11 天前69 贊 · 6 條評論
- Python黑帽編程2.1 Python編程哲學本節的內容有些趣味性,涉及到很多人為什麼會選擇Python,為什麼會喜歡這門語言。我帶大家膜拜下Python作者的Python之禪… 查看全文玄魂工作室-玄魂 · 11 天前267 贊 · 40 條評論
- Python黑帽編程 2.0 第二章概述於 20世紀80年代末,Guido van Rossum發明了Python,初衷據說是為了打發聖誕節的無趣,1991年首次發布,是ABC語言的繼承… 查看全文玄魂工作室-玄魂 · 15 天前13 贊
- 如何學python-第六課 流程式控制制-IF,ELSE,條件語句在上一篇文章里,我們介紹了流程式控制制的概念,並介紹了布爾類型。今天,我們會把上節課學到的東西與 if、else結合起來使… 查看全文李三思 · 15 天前8 贊 · 6 條評論
- Python黑帽編程1.5 使用Wireshark練習網路協議分析1.5.0.1 本系列教程說明本系列教程,採用的大綱母本為《Understanding Network Hacks Attack and Defense with Python… 查看全文玄魂工作室-玄魂 · 16 天前71 贊 · 17 條評論
- 如何學python-第五課 流程式控制制初階 布爾類型當我們寫程序的時候,我們首要思考的問題就是,程序接收什麼樣的輸入,產生什麼樣的輸出。控制用戶的輸入,進行一系列處… 查看全文李三思 · 16 天前10 贊
- 如何學python-第四課 基本的用戶輸入譯者註:原作者留的練習任務都比較靈活,並不是具體的要求。而根據我自身的經驗,很多同學看到這種需要探索精神的要求,… 查看全文李三思 · 17 天前8 贊 · 6 條評論
- 如何學python-第三課 基礎字元串操作在上一篇文章中,我們學習了有關變數和輸出的一些基礎知識。大家應該還記得在上一篇文章中出現的字元串類型(string)吧… 查看全文李三思 · 18 天前7 贊 · 5 條評論
- 如何學python-第二課 基礎輸出/變數/變數類型在python和其他主流的腳本語言里,有幾樣東西會在你在漫長的編程生涯里一直伴隨著你——不外乎輸出,變數,以及變數… 查看全文李三思 · 18 天前10 贊 · 4 條評論
- 如何學python-第一課 入門簡介最近在論壇上閑逛的時候,我發現了一些相當不錯的python腳本編程的文章。不過,這些文章也有它們的局限性,因為它們更多… 查看全文李三思 · 18 天前62 贊 · 13 條評論
- 烏雲掛了,知識庫的文章卻在流傳朋友圈都在轉,我也湊個熱鬧,涉及侵權或者違反法律,請通知我。烏雲知識庫文章:鏈接:http://pan.baidu.com/s/1hsGy5d… 查看全文玄魂工作室-玄魂 · 19 天前120 贊 · 25 條評論
- Python黑帽編程1.3 Python運行時與包管理工具0.1 本系列教程說明本系列教程,採用的大綱母本為《Understanding Network Hacks Attack and Defense with Python》一… 查看全文玄魂工作室-玄魂 · 19 天前26 贊 · 14 條評論
- 關於《Python黑帽編程1.2》引發的基礎知識與工具的爭議上一篇文章《Python黑帽編程1.2 基於VS Code構建Python開發環境》在知乎發布後,首先引起了大家關於工具的爭議。開發Pyt… 查看全文玄魂工作室-玄魂 · 22 天前133 贊 · 39 條評論
- Python黑帽編程1.2 基於VS Code構建Python開發環境Python黑帽編程1.2 基於VS Code構建Python開發環境0.1 本系列教程說明本系列教程,採用的大綱母本為《Understanding N… 查看全文玄魂工作室-玄魂 · 23 天前120 贊 · 42 條評論
- Python黑帽編程1.1虛擬機安裝和配置 Kali Linux 2016Python黑帽編程1.1虛擬機安裝和配置 Kali Linux 20160.1 本系列教程說明本系列教程,採用的大綱母本為《Understanding … 查看全文玄魂工作室-玄魂 · 24 天前93 贊 · 35 條評論
- 使用you-get下載視頻網站視頻或其他使用you-get下載視頻網站視頻或其他文/玄魂 目錄使用you-get下載視頻網站視頻或其他前言1.1 下載、安裝依賴exe安裝pip安裝Antigen安裝Git 克隆源碼Homebrew 安… 查看全文玄魂工作室-玄魂 · 1 個月前23 贊 · 9 條評論
- asp.net core 開發環境準備1.1 安裝sdk和運行時瀏覽器打開網址https://www.microsoft.com/net/download, 到.Net Core下載頁面。根據操作系統,下… 查看全文玄魂工作室-玄魂 · 1 個月前5 贊 · 1 條評論
- Python黑客編程基礎3網路數據監聽和過濾Python黑客編程3網路數據監聽和過濾 課程的實驗環境如下:? 操作系統:kali Linux 2.0? 編程工具:Wing ID… 查看全文玄魂工作室-玄魂 · 2 個月前380 贊 · 14 條評論
- debian(kali Linux) 安裝net Coredebian(kali Linux) 安裝net Corecurl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts… 查看全文玄魂工作室-玄魂 · 3 個月前
- 嗅探、中間人sql注入、反編譯--例說桌面軟體安全性問題今天這篇文章不準備講太多理論,講我最近遇到的一個案例。從技術上講,這個例子沒什麼高深的,還有一點狗屎運的成分,但… 查看全文玄魂工作室-玄魂 · 3 個月前6 贊 · 2 條評論
- Python黑客編程2 入門demo--zip暴力破解上一篇文章,我們在Kali Linux中搭建了基本的Python開發環境,本篇文章為了拉近Python和大家的距離,我們寫一個暴力破解… 查看全文玄魂工作室-玄魂 · 3 個月前16 贊 · 3 條評論
- kali linux Python 黑客編程1 開發環境初始化為什麼要選擇Python?Python作為目前Linux系統下最流行的編程語言之一,對於安全工作者的作用可以和C++相提並論。Python… 查看全文玄魂工作室-玄魂 · 3 個月前15 贊 · 1 條評論
- kali 在線教學群 第一次 公開課 小結(1)
機器學習和數據挖掘的全棧語言。有人答java有分散式平台。其實這些分散式平台在應用上同樣支持Python 。
Python 是慢,但我無所謂
為犧牲性能追求生產率而吶喊
讓我從關於 Python 中的 asyncio 這個標準庫的討論中休息一會,談談我最近正在思考的一些東西:Python 的速度。對不了解我的人說明一下,我是一個 Python 的粉絲,而且我在我能想到的所有地方都積極地使用 Python。人們對 Python 最大的抱怨之一就是它的速度比較慢,有些人甚至拒絕嘗試使用 Python,因為它比其他語言速度慢。這裡說說為什麼我認為應該嘗試使用 Python,儘管它是有點慢。
速度不再重要
過去的情形是,程序需要花費很長的時間來運行,CPU 比較貴,內存也很貴。程序的運行時間是一個很重要的指標。計算機非常的昂貴,計算機運行所需要的電也是相當貴的。對這些資源進行優化是因為一個永恆的商業法則:
優化你最貴的資源。
在過去,最貴的資源是計算機的運行時間。這就是導致計算機科學致力於研究不同演算法的效率的原因。然而,這已經不再是正確的,因為現在硅晶元很便宜,確實很便宜。運行時間不再是你最貴的資源。公司最貴的資源現在是它的員工時間。或者換句話說,就是你。把事情做完比把它變快更加重要。實際上,這是相當的重要,我將把它再次放在這裡,彷彿它是一個引文一樣(給那些只是粗略瀏覽的人):
把事情做完比快速地做事更加重要。
你可能會說:「我的公司在意速度,我開發一個 web 應用程序,那麼所有的響應時間必須少於 x 毫秒。」或者,「我們失去了客戶,因為他們認為我們的 app 運行太慢了。」我並不是想說速度一點也不重要,我只是想說速度不再是最重要的東西;它不再是你最貴的資源。
速度是唯一重要的東西
當你在編程的背景下說 速度 時,你通常是說性能,也就是 CPU 周期。當你的 CEO 在編程的背景下說 速度 時,他指的是業務速度,最重要的指標是產品上市的時間。基本上,你的產品/web 程序是多麼的快並不重要。它是用什麼語言寫的也不重要。甚至它需要花費多少錢也不重要。在一天結束時,讓你的公司存活下來或者死去的唯一事物就是產品上市時間。我不只是說創業公司的想法 -- 你開始賺錢需要花費多久,更多的是「從想法到客戶手中」的時間期限。企業能夠存活下來的唯一方法就是比你的競爭對手更快地創新。如果在你的產品上市之前,你的競爭對手已經提前上市了,那麼你想出了多少好的主意也將不再重要。你必須第一個上市,或者至少能跟上。一但你放慢了腳步,你就輸了。
企業能夠存活下來的唯一方法就是比你的競爭對手更快地創新。
一個微服務的案例
像 Amazon、Google 和 Netflix 這樣的公司明白快速前進的重要性。他們創建了一個業務系統,可以使用這個系統迅速地前進和快速的創新。微服務是針對他們的問題的解決方案。這篇文章不談你是否應該使用微服務,但是至少要理解為什麼 Amazon 和 Google 認為他們應該使用微服務。
微服務本來就很慢。微服務的主要概念是用網路調用來打破邊界。這意味著你正在把使用的函數調用(幾個 cpu 周期)轉變為一個網路調用。沒有什麼比這更影響性能了。和 CPU 相比較,網路調用真的很慢。但是這些大公司仍然選擇使用微服務。我所知道的架構裡面沒有比微服務還要慢的了。微服務最大的弊端就是它的性能,但是最大的長處就是上市的時間。通過在較小的項目和代碼庫上建立團隊,一個公司能夠以更快的速度進行迭代和創新。這恰恰表明了,非常大的公司也很在意上市時間,而不僅僅只是只有創業公司。
CPU 不是你的瓶頸
如果你在寫一個網路應用程序,如 web 伺服器,很有可能的情況會是,CPU 時間並不是你的程序的瓶頸。當你的 web 伺服器處理一個請求時,可能會進行幾次網路調用,例如到資料庫,或者像 Redis 這樣的緩存伺服器。雖然這些服務本身可能比較快速,但是對它們的網路調用卻很慢。這裡有一篇很好的關於特定操作的速度差異的博客文章。在這篇文章里,作者把 CPU 周期時間縮放到更容易理解的人類時間。如果一個單獨的 CPU 周期等同於 1 秒,那麼一個從 California 到 New York 的網路調用將相當於 4 年。那就說明了網路調用是多少的慢。按一些粗略估計,我們可以假設在同一數據中心內的普通網路調用大約需要 3 毫秒。這相當於我們「人類比例」 3 個月。現在假設你的程序是高 CPU 密集型,這需要 100000 個 CPU 周期來對單一調用進行響應。這相當於剛剛超過 1 天。現在讓我們假設你使用的是一種要慢 5 倍的語言,這將需要大約 5 天。很好,將那與我們 3 個月的網路調用時間相比,4 天的差異就顯得並不是很重要了。如果有人為了一個包裹不得不至少等待 3 個月,我不認為額外的 4 天對他們來說真的很重要。
上面所說的終極意思是,儘管 Python 速度慢,但是這並不重要。語言的速度(或者 CPU 時間)幾乎從來不是問題。實際上谷歌曾經就這一概念做過一個研究,並且他們就此發表過一篇論文。那篇論文論述了設計高吞吐量的系統。在結論里,他們說到:
在高吞吐量的環境中使用解釋性語言似乎是矛盾的,但是我們已經發現 CPU 時間幾乎不是限制因素;語言的表達性是指,大多數程序是源程序,同時它們的大多數時間花費在 I/O 讀寫和本機的運行時代碼上。而且,解釋性語言無論是在語言層面的輕鬆實驗還是在允許我們在很多機器上探索分布計算的方法都是很有幫助的,
再次強調:
CPU 時間幾乎不是限制因素。
如果 CPU 時間是一個問題怎麼辦?
你可能會說,「前面說的情況真是太好了,但是我們確實有過一些問題,這些問題中 CPU 成為了我們的瓶頸,並造成了我們的 web 應用的速度十分緩慢」,或者「在伺服器上 X 語言比 Y 語言需要更少的硬體資源來運行。」這些都可能是對的。關於 web 伺服器有這樣的美妙的事情:你可以幾乎無限地負載均衡它們。換句話說,可以在 web 伺服器上投入更多的硬體。當然,Python 可能會比其他語言要求更好的硬體資源,比如 c 語言。只是把硬體投入在 CPU 問題上。相比於你的時間,硬體就顯得非常的便宜了。如果你在一年內節省了兩周的生產力時間,那將遠遠多於所增加的硬體開銷的回報。
那麼,Python 更快一些嗎?
這一篇文章裡面,我一直在談論最重要的是開發時間。所以問題依然存在:當就開發時間而言,Python 要比其他語言更快嗎?按常規慣例來看,我、google 還有其他幾個人可以告訴你 Python 是多麼的高效。它為你抽象出很多東西,幫助你關注那些你真正應該編寫代碼的地方,而不會被困在瑣碎事情的雜草里,比如你是否應該使用一個向量或者一個數組。但你可能不喜歡只是聽別人說的這些話,所以讓我們來看一些更多的經驗數據。
在大多數情況下,關於 python 是否是更高效語言的爭論可以歸結為腳本語言(或動態語言)與靜態類型語言兩者的爭論。我認為人們普遍接受的是靜態類型語言的生產力較低,但是,這有一篇優秀的論文解釋了為什麼不是這樣。就 Python 而言,這裡有一項研究,它調查了不同語言編寫字元串處理的代碼所需要花費的時間,供參考。
在上述研究中,Python 的效率比 Java 高出 2 倍。有一些其他研究也顯示相似的東西。 Rosetta Code 對編程語言的差異進行了深入的研究。在論文中,他們把 python 與其他腳本語言/解釋性語言相比較,得出結論:
Python 更簡潔,即使與函數式語言相比較(平均要短 1.2 到 1.6 倍)
普遍的趨勢似乎是 Python 中的代碼行總是更少。代碼行聽起來可能像一個可怕的指標,但是包括上面已經提到的兩項研究在內的多項研究表明,每種語言中每行代碼所需要花費的時間大約是一樣的。因此,限制代碼行數就可以提高生產效率。甚至 codinghorror(一名 C# 程序員)本人寫了一篇關於 Python 是如何更有效率的文章。
我認為說 Python 比其他的很多語言更加的有效率是公正的。這主要是由於 Python 有大量的自帶以及第三方庫。這裡是一篇討論 Python 和其他語言間的差異的簡單的文章。如果你不知道為何 Python 是如此的小巧和高效,我邀請你藉此機會學習一點 python,自己多實踐。這兒是你的第一個程序:
import __hello__
但是如果速度真的重要呢?
上述論點的語氣可能會讓人覺得優化與速度一點也不重要。但事實是,很多時候運行時性能真的很重要。一個例子是,你有一個 web 應用程序,其中有一個特定的端點需要用很長的時間來響應。你知道這個程序需要多快,並且知道程序需要改進多少。
在我們的例子中,發生了兩件事:
- 我們注意到有一個端點執行緩慢。
- 我們承認它是緩慢,因為我們有一個可以衡量是否足夠快的標準,而它沒達到那個標準。
我們不必在應用程序中微調優化所有內容,只需要讓其中每一個都「足夠快」。如果一個端點花費了幾秒鐘來響應,你的用戶可能會注意到,但是,他們並不會注意到你將響應時間由 35 毫秒降低到 25 毫秒。「足夠好」就是你需要做到的所有事情。免責聲明: 我應該說有一些應用程序,如實時投標程序,確實需要細微優化,每一毫秒都相當重要。但那只是例外,而不是規則。
為了明白如何對端點進行優化,你的第一步將是配置代碼,並嘗試找出瓶頸在哪。畢竟:
任何除了瓶頸之外的改進都是錯覺。Any improvements made anywhere besides the bottleneck are an illusion. -- Gene Kim
如果你的優化沒有觸及到瓶頸,你只是浪費你的時間,並沒有解決實際問題。在你優化瓶頸之前,你不會得到任何重要的改進。如果你在不知道瓶頸是什麼前就嘗試優化,那麼你最終只會在部分代碼中玩耍。在測量和確定瓶頸之前優化代碼被稱為「過早優化」。人們常提及 Donald Knuth 說的話,但他聲稱這句話實際上是他從別人那裡聽來的:
過早優化是萬惡之源Premature optimization is the root of all evil。
在談到維護代碼庫時,來自 Donald Knuth 的更完整的引文是:
在 97% 的時間裡,我們應該忘記微不足道的效率:過早的優化是萬惡之源。然而在關 鍵的 3%,我們不應該錯過優化的機會。 —— Donald Knuth
換句話說,他所說的是,在大多數時間你應該忘記對你的代碼進行優化。它幾乎總是足夠好。在不是足夠好的情況下,我們通常只需要觸及 3% 的代碼路徑。比如因為你使用了 if 語句而不是函數,你的端點快了幾納秒,但這並不會使你贏得任何獎項。
過早的優化包括調用某些更快的函數,或者甚至使用特定的數據結構,因為它通常更快。計算機科學認為,如果一個方法或者演算法與另一個具有相同的漸近增長(或稱為 Big-O),那麼它們是等價的,即使在實踐中要慢兩倍。計算機是如此之快,演算法隨著數據/使用增加而造成的計算增長遠遠超過實際速度本身。換句話說,如果你有兩個 O(log n) 的函數,但是一個要慢兩倍,這實際上並不重要。隨著數據規模的增大,它們都以同樣的速度「慢下來」。這就是過早優化是萬惡之源的原因;它浪費了我們的時間,幾乎從來沒有真正有助於我們的性能改進。
就 Big-O 而言,你可以認為對你的程序而言,所有的語言都是 O(n),其中 n 是代碼或者指令的行數。對於同樣的指令,它們以同樣的速率增長。對於漸進增長,一種語言的速度快慢並不重要,所有語言都是相同的。在這個邏輯下,你可以說,為你的應用程序選擇一種語言僅僅是因為它的「快速」是過早優化的最終形式。你選擇某些預期快速的東西,卻沒有測量,也不理解瓶頸將在哪裡。
為您的應用選擇語言只是因為它的「快速」,是過早優化的最終形式。
優化 Python
我最喜歡 Python 的一點是,它可以讓你一次優化一點點代碼。假設你有一個 Python 的方法,你發現它是你的瓶頸。你對它優化過幾次,可能遵循這裡和那裡的一些指導,現在,你很肯定 Python 本身就是你的瓶頸。Python 有調用 C 代碼的能力,這意味著,你可以用 C 重寫這個方法來減少性能問題。你可以一次重寫一個這樣的方法。這個過程允許你用任何可以編譯為 C 兼容彙編程序的語言,編寫良好優化後的瓶頸方法。這讓你能夠在大多數時間使用 Python 編寫,只在必要的時候都才用較低級的語言來寫代碼。
有一種叫做 Cython 的編程語言,它是 Python 的超集。它幾乎是 Python 和 C 的合併,是一種漸進類型的語言。任何 Python 代碼都是有效的 Cython 代碼,Cython 代碼可以編譯成 C 代碼。使用 Cython,你可以編寫一個模塊或者一個方法,並逐漸進步到越來越多的 C 類型和性能。你可以將 C 類型和 Python 的鴨子類型混在一起。使用 Cython,你可以獲得混合後的完美組合,只在瓶頸處進行優化,同時在其他所有地方不失去 Python 的美麗。
星戰前夜的一幅截圖:這是用 Python 編寫的 space MMO 遊戲。
當您最終遇到 Python 的性能問題阻礙時,你不需要把你的整個代碼庫用另一種不同的語言來編寫。你只需要用 Cython 重寫幾個函數,幾乎就能得到你所需要的性能。這就是星戰前夜採取的策略。這是一個大型多玩家的電腦遊戲,在整個架構中使用 Python 和 Cython。它們通過優化 C/Cython 中的瓶頸來實現遊戲級別的性能。如果這個策略對他們有用,那麼它應該對任何人都有幫助。或者,還有其他方法來優化你的 Python。例如,PyPy是一個 Python 的 JIT 實現,它通過使用 PyPy 替掉 CPython(這是 Python 的默認實現),為長時間運行的應用程序提供重要的運行時改進(如 web 伺服器)。
讓我們回顧一下要點:
- 優化你最貴的資源。那就是你,而不是計算機。
- 選擇一種語言/框架/架構來幫助你快速開發(比如 Python)。不要僅僅因為某些技術的快而選擇它們。
- 當你遇到性能問題時,請找到瓶頸所在。
- 你的瓶頸很可能不是 CPU 或者 Python 本身。
- 如果 Python 成為你的瓶頸(你已經優化過你的演算法),那麼可以轉向熱門的 Cython 或者 C。
- 盡情享受可以快速做完事情的樂趣。
我希望你喜歡閱讀這篇文章,就像我喜歡寫這篇文章一樣。如果你想說謝謝,請為我點下贊。另外,如果某個時候你想和我討論 Python,你可以在 twitter 上艾特我(@nhumrich),或者你可以在 Python slack channel找到我。
作者簡介:
Nick Humrich -- 堅持採用持續交付的方法,並為之寫了很多工具。同是還是一名 Python 黑客與技術狂熱者,目前是一名 DevOps 工程師。
(題圖:Pixabay,CC0)
via: https://medium.com/hacker-daily/yes-python-is-slow-and-i-dont-care-13763980b5a1
作者:Nick Humrich 譯者:zhousiyu325 校對:jasminepeng
文章素材來源【開源中國社區】 Python 是慢,但我無所謂 - 開源中國社區
Python 和 Java都是 通用語言 (general purpose) 就是說幹啥都乾的了。它倆最大的區別是:python 是動態類,Java是靜態類。動態類的好處是寫的爽,但是跑到慢。而且項目大了容易把自己搞糊塗。適用於:scripts, (因為小) 網路應用(因為速度無所謂網速慢多了)靜態類安全快,但是寫的蛋疼。適用與大型網站或服務。
額...其他方面的應用我不太清楚。但是作為科技研發用的simulation工具,python是很理想的。很大程度上可以替代matlab等傳統工具(當然simulink, auto code generation這種是不行的...)。另外python可以支持functional programming,所以作為ai/algorithm研究的工具也可以。語法簡單,數學庫比較成熟,免費,實現快是優點。我的建議是,任何把科研作為以後方向的同學,都可以把python作為第一計算語言來掌握。其他方面我不了解,所以不予置評。
搞原型的最佳選擇,特別是網路和科學方面,要知道美國很多大學非計算機專業教python而不是譚浩強,所以各種稀奇古怪的庫都有,現在很火的人臉識別,機器學習,神經網路都有成品因為簡單,上手快,所以新手生產率也不錯,想玩好就是另外一回事了。
幾乎是萬能的,創業公司的首選
看了大家的回答,都很好,但我覺得都漏了一點,忍不住也回答一下
我覺得既然問這個問題,肯定是要選擇到底學哪門語言吧,那麼選擇哪門語言,我覺得要因人而異。
首先,python是一門膠水語言,啥都能幹,但啥都能幹的話,就有可能很多東西幹得不精。我舉一些個人經歷來進一步說明一下。
普通工程實現方面
之前朋友創業,做機器人,我幫忙策劃整個招聘和技術流程。創業公司需要的是速度,要快速驗證想法,快速試錯。而機器人公司並不會有非常大的網路使用量,訪問後台也只是獲取一些數據信息而已,瓶頸在IO,不在CPU。所以權衡了開發速度,我就選擇招聘python的工程師。其中也有很大一部分原因是很多人工智慧的庫是python寫的,庫的底層還是用C++, CUDA實現 執行速度和C++沒有啥區別。這個機器人產品上可以看到,我們不是要看使用什麼語言,而是要看瓶頸在哪裡?時間?網路?大家要知道 instagram, dropbox 他們第一版的時候都是用 python 開發的,後面融資了,再考慮要不要用其他語言實現。
另外一個朋友開發的是手游,我建議用 MongoDB + Java 來做。(題主也問了Java)這是因為手游聯網需要的訪問量很大的,對資料庫操作很多,這樣的話,python就比不上Java了,有人可能會問為什麼不用C++, 那是因為招聘到好的C++開發程序員比較難,而且用得不好,性能還比不上Java開發的呢,保險起見招聘Java的。
人工智慧,數據處理方面
請選擇python。其實python什麼都能幹,但是主要集中在web、服務端、數據分析、科學計算、數據服務等領域。方向還是比較多的,題主一定要選好方向,不喜歡的方向做起來其實也是痛苦的。
Python對比java就好比windiow對比mac
不得不學的語言小網站有ASP和PHP,大網站有Java和.net,Python只夾在中間尋求發展,不過天下之大,應用軟體和網站那麼多,誰也不肯能獨霸市場!
Python 其實也想做萬金油的, 它不僅支持數據分析,C語言庫讓你的速度飛起,它還可以運用在機器學習等其他領域。 我個人喜歡PYTHON。
Python的設計哲學是「優雅」、「明確」、「簡單」。因此,Perl語言中「總是有多種方法來做同一件事」的理念在Python開發者中通常是難以忍受的。Python開發者的哲學是「用一種方法,最好是只有一種方法來做一件事」。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確的沒有或者很少有歧義的語法。由於這種設計觀念的差異,Python源代碼通常被認為比Perl具備更好的可讀性,並且能夠支撐大規模的軟體開發。這些準則被稱為Python格言。在Python解釋器內運行import this可以獲得完整的列表。
Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python內。所以很多人認為Python很慢。不過,根據二八定律,大多數程序對速度要求不高。在某些對運行速度要求很高的情況,Python設計師傾向於使用JIT技術,或者用使用C/C++語言改寫這部分程序。可用的JIT技術是PyPy。
Python是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標準庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
雖然Python可能被粗略地分類為「腳本語言」(script language),但實際上一些大規模軟體開發計劃例如Zope、Mnet及BitTorrent,Google也廣泛地使用它。Python的支持者較喜歡稱它為一種高級動態編程語言,原因是「腳本語言」泛指僅作簡單程序設計任務的語言,如shellscript、VBScript等只能處理簡單任務的編程語言,並不能與Python相提並論。
Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程序員能夠輕鬆地使用C語言、C++、Cython來編寫擴充模塊。Python編譯器本身也可以被集成到其它需要腳本語言的程序內。因此,很多人還把Python作為一種「膠水語言」(glue language)使用。使用Python將其他語言編寫的程序進行集成和封裝。在Google內部的很多項目,例如Google Engine使用C++編寫性能要求極高的部分,然後用Python或Java/Go調用相應的模塊。《Python技術手冊》的作者馬特利(Alex Martelli)說:「這很難講,不過,Python 已在Google 內部使用,Google 召募許多 Python 高手,但在這之前就已決定使用Python,他們的目的是 Python where we can, C++ where we must,在操控硬體的場合使用 C++,在快速開發時候使用 Python。
學好python你需要一個良好的環境,一個優質的開發交流群,群里都是那種相互幫助的人才是可以的,我有建立一個python學習交流群,在群里我們相互幫助,相互關心,相互分享內容,這樣出問題幫助你的人就比較多,群號是301,還有056,最後是051,這樣就可以找到大神聚合的群,如果你只願意別人幫助你,不願意分享或者幫助別人,那就請不要加了,你把你會的告訴別人這是一種分享。
學習是對自己最好的投資,而機會屬於有準備的人,這是一個看臉的時代,但最終拼的是實力。人和人之間的差距不在於智商,而在於如何利用業餘時間,所以沒有等出來的輝煌,只有干出來的精彩。其實只要你想學習,什麼時候開始都不晚,不要擔心這擔心那,你只需努力,剩下的交給時間,而你之所以還沒有變強,只因你還不夠努力,要記得付出不亞於任何人的努力。
Python是什麼?
Python是一種計算機程序設計語言。你可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁編程的JavaScript語言等等。為什麼要學Python?
不同的編程語言,干同一個活,編寫的代碼量,差距也很大。比如,完成同一個任務,C語言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。學Python有用嗎?
連Google、Facebook都在大規模使用Python,你就不用擔心學了會沒用。我該怎麼學Python?
首先,得擁有一本書,別猶豫了,這本書就是為你準備的。然後,每天能抽出半個小時學習。 書山有路勤為徑,學海無涯苦作舟,相信自己,你就是下一個大牛! 書籍鏈接:http://yuedu.baidu.com/ebook/ec1aa9f7b90d6c85ec3ac6d7推薦閱讀:
※技術分享 | 用Python爬蟲進行網站數據獲取(II)
※六步使用Python寫一個小小的自動化項目監控客網站全實現
※用半年的時間來開發一個新網站,應該選 PHP 還是 Python?
※關於 Live 的預告
TAG:Python |