本文目錄一覽:
- 1、如何提高python的運行效率
- 2、python 計算程序運行了多長時間?
- 3、測試Swift,Ruby, Python, Java等編程語言的代碼運行速度和佔用內存時有沒有能直觀顯示出來的工具
- 4、使用Cython讓python代碼的速度提高30倍以上
- 5、python語言運行速度如此差?
如何提高python的運行效率
竅門一:關鍵代碼使用外部功能包
Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。以下是一些你可以選擇用來提升效率的功能包:
Cython
Pylnlne
PyPy
Pyrex
這些功能包的用處各有不同。比如說,使用C語言的數據類型,可以使涉及內存操作的任務更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C代碼。內聯代碼是獨立編譯的,但是它把所有編譯文件都保存在某處,並能充分利用C語言提供的高效率。
竅門二:在排序時使用鍵
Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法其實是儘可能多地使用鍵和內置的sort()方法。譬如,拿下面的代碼來說:
import operator
somelist = [(1, 5, , (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(0))
somelist
#Output = [(1, 5, , (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(1))
somelist
#Output = [(6, 2, 4), (1, 5, , (9, 7, 5)]
somelist.sort(key=operator.itemgetter(2))
somelist
#Output = [(6, 2, 4), (9, 7, 5), (1, 5, ]
在每段例子里,list都是根據你選擇的用作關鍵參數的索引進行排序的。這個方法不僅對數值類型有效,還同樣適用於字元串類型。
竅門三:針對循環的優化
每一種編程語言都強調最優化的循環方案。當使用Python時,你可以藉助豐富的技巧讓循環程序跑得更快。然而,開發者們經常遺忘的一個技巧是:盡量避免在循環中訪問變數的屬性。譬如,拿下面的代碼來說:
lowerlist = [‘this’, ‘is’, ‘lowercase’]
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = [‘THIS’, ‘IS’, ‘LOWERCASE’]
每次你調用str.upper, Python都會計算這個式子的值。然而,如果你把這個求值賦值給一個變數,那麼求值的結果就能提前知道,Python程序就能運行得更快。因此,關鍵就是儘可能減小Python在循環中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。
(注意:優化循環的方法還有很多,這只是其中之一。比如,很多程序員會認為,列表推導式是提高循環速度的最佳方法。關鍵在於,優化循環方案是提高應用程序運行速度的上佳選擇。)
竅門四:使用較新的Python版本
如果你在網上搜索Python,你會發現數不盡的信息都是關於如何升級Python版本。通常,每個版本的Python都會包含優化內容,使其運行速度優於之前的版本。但是,限制因素在於,你最喜歡的函數庫有沒有同步更新支持新的Python版本。與其爭論函數庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支持這一更新。
你要保證自己的代碼在新版本里還能運行。你需要使用新的函數庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。
然而,如果你只是確保自己的應用在新版本中可以運行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,用戶才能在更新之初就覺察到應用性能的改觀。
竅門五:嘗試多種編碼方法
每次創建應用時都使用同一種編碼方法幾乎無一例外會導致應用的運行效率不盡人意。可以在程序分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的數據項時,你既可以使用安全的方法,先確保數據項已經存在再進行更新,也可以直接對數據項進行更新,把不存在的數據項作為特例分開處理。請看下面第一段代碼:
n = 16
myDict = {}
for i in range(0, n):
char = ‘abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
當一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,myDict填滿了數據,至少填有大部分數據,這時換另一種方法會更有效率。
n = 16
myDict = {}
for i in range(0, n):
char = ‘abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在兩種方法中輸出結果都是一樣的。區別在於輸出是如何獲得的。跳出常規的思維模式,創建新的編程技巧能使你的應用更有效率。
竅門六:交叉編譯你的應用
開發者有時會忘記計算機其實並不理解用來創建現代應用程序的編程語言。計算機理解的是機器語言。為了運行你的應用,你藉助一個應用將你所編的人類可讀的代碼轉換成機器可讀的代碼。有時,你用一種諸如Python這樣的語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來說,是可行的。關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。
Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉化成C++代碼。這樣,你就可以在native模式下執行自己的應用,而無需依賴於解釋器程序。你會發現自己的應用運行效率有了較大的提高,但是這會因平台和任務的差異而有所不同。
(注意:Nuitka現在還處在測試階段,所以在實際應用中請多加註意。實際上,當下最好還是把它用於實驗。此外,關於交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。開發者已經使用交叉編譯多年,用來提高應用的速度。記住,每一種解決辦法都有利有弊,在把它用於生產環境之前請仔細權衡。)
在使用交叉編譯器時,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要一個Python解釋器和一個C++編譯器。Nuitka支持許多C++編譯器,其中包括Microsoft Visual Studio,MinGW 和 Clang/LLVM。
交叉編譯可能造成一些嚴重問題。比如,在使用Nuitka時,你會發現即便是一個小程序也會消耗巨大的驅動空間。因為Nuitka藉助一系列的動態鏈接庫(DDLs)來執行Python的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。
python 計算程序運行了多長時間?
python 計算程序運行時間:
6.760052s
一、import time
二、start =time.clock()
三、#執行程序,比如計算1到100的和。
sum=0
for i in range(1,101):
sum=sum+i
print(sum )
四、end = time.clock()
print(‘Running time: %s Seconds’%(end-start))#其中end-start就是程序運行的時間,單位是秒。
五、
#全部程序如下
import time
start =time.clock()
sum=0
for i in range(1,101):
sum=sum+i
print(sum )
end = time.clock()
print(‘Running time: %s Seconds’%(end-start))
#輸出結果
1、問題:
用python計算昨天,今天,明天的日期是這個格式么?Python2.7(r27:82525,Jul42010,09:01:59)[MSCv.150032bit(Intel)]onwin32Type防抓取,突襲網提供內容,請查看原文。
給定你兩個日期,如何計算這兩個日期之間間隔幾天,幾個星期,幾個月,幾年?
為什麼Python適合科學計算?毫不誇張的說,你用python開發程序只要fortran的1/10時間。4.其他。它豐富而且統一,不像C++的庫那麼雜(好比linux的各種發行版),python學好n防抓取,突襲網提供內容,請查看原文。
2、解決方法:
我有個問題想請教下,如何用python計算出某目錄中所有文件存…1234567891011import osimport datetime path =n防抓取,突襲網提供內容,請查看原文。
標準模塊datetime和第三方包dateutil(特別是dateutil的rrule.count方法)能非常簡單迅速的幫你解決這個問題。
Python構造日期對象和計算日期間天數差的問題python時間模塊time,日期模塊datetime,格式化用strftime()importdatetime防抓取,突襲網提供內容,請查看原文。
from dateutil import rrule import datetime def weeks_between(start_date, end_date): weeks = rrule.rrule(rrule.WEEKLY, dtstart=start_date, until=end_date) return weeks.count( )
Python構造日期對象和計算日期間天數差的問題python時間模塊time,日期模塊datetime,格式化用strftime()gt;gt;gt;importdatetimegt;gt;gt;help(datetime)查看2009年5月31日和2009…防抓取,突襲網提供內容,請查看原文。
rrule方法允許你根據日期(DAILY),星期(WEEKLY),年(YEARLY)來設置尺度計算。下面用一段代碼來測試一下:
pytho將txt文件轉換為列表問:想把這些帶空格的文字轉化為python中列表,就是[‘大數據’,’和』,……]…答:importrecontent=”大數據和社會”datas=re.s防抓取,突襲網提供內容,請查看原文。
if _ _name_ _==’_ _main_ _’: starts = [datetime.date(2005, 01, 04), datetime.date(2005, 01, 03)] end = datetime.date(2005, 01, 10) for s in starts: days = rrule.rrule(rrule.DAILY, dtstart=s, until=end).count( ) print “%d days shows as %d weeks “% (days, weeks_between(s, end))
pytho怎麼安裝tensor答:easy_install或者pip都可以,要看你這個tensor是啥時候的東西了,應該pip能解決!你在python的安裝目錄下找pip,之後放到path裡面去,之後運行pip–help去看詳細的命令介紹,很簡單的PS:如果在windows下,python包安裝會很費勁,不是少了…防抓取,突襲網提供內容,請查看原文。
將輸出這樣的結果:
初學Pytho2.7關於整數相加的問題!問:#-*-coding:utf-8-*-sum=0forxin【1,2,3,4,5,6,7,8,9,10】:…答:所說所有的變數都是對象。對象在pytho防抓取,突襲網提供內容,請查看原文。
7 days shows as 1 weeks
如何用pytho寫rhino文件答:1、首先下載MAC版的64位Eclipse,然後解壓縮。2、下載Python。MAC自帶的是的python版本比較老,所以去下個新版本,下載後安裝,dmg的pyth防抓取,突襲網提供內容,請查看原文。
8 days shows as 2 weeks
為什麼python中print可以運行,而print”ilo…答:為什麼python中print可以運行,而防抓取,突襲網提供內容,請查看原文。
Rrule計算是以整數計算的,它不會返回0.5星期之類的結果,所以8天會被算為兩個星期。
pytho安裝路徑錯誤怎麼卸載問:python安裝時路徑寫錯,忘記這個電腦沒沒E盤,安裝失敗,卸載時總報錯,…答:可以重啟一下你的電腦然後安裝電腦管家在電腦上通過工具箱的軟體管理,自動卸載該軟體即防抓取,突襲網提供內容,請查看原文。
當然你可以不必定義一個尺寸,直接一句return rrule.rrule(rrule.WEEKLY, dtstart=start_date, until=end_date).count( )就可以得到結果。
pytho編寫腳本用於什麼測試答:PY可以實現很多東西的自動化啊主要可以寫一些腳本幫助解決一些重複性勞作以及解決程序的一些自動化防抓取,突襲網提供內容,請查看原文。
希望本文所述對大家的Python程序設計有所幫助。
測試Swift,Ruby, Python, Java等編程語言的代碼運行速度和佔用內存時有沒有能直觀顯示出來的工具
Java:面向對象,開源,不說跨平台了哈,噁心;不直接支持硬體級別的處理等。C/CPP:C面向過程,CPP面向對象(部分比較怪異),分裂比較嚴重,支持硬體級別的處理。ptyhon:動態解釋型,開發效率高,開源,靈活,入門低。上面只是簡單的說了下一些比較明顯的特點。你問哪門語言更強大,我不知道,都很強大吧,嵌入式C/CPP用的比較多,雖說java也摻和過,但貌似J2ME半死不活的。J2SE(現在改名javaSE)也沒多大前景,無論UI還是性能比不上C#,CPP,論開發效率,也就那麼回事吧。但j2ee在B/S領域比較強大(不是說網站哈),百萬級別的大部分java寫的。python也很有優勢,在快速建模和web方面。大項目我還真沒見過幾個,ruby到見的不少。學哪個更有前途,這麼說吧,你就是把所有語言都學了,也就那麼回事。重要的是是否善於思考,愛好學習,將學會的東西應用到實際的業務場景中去。實際工作中編程可不是聲明幾個變數,排排序,冒冒泡,列印列印字元。學習語言只是個開始,祝你好用!附:java,C/C++隨便挑吧,python相對入門比較簡單。
使用Cython讓python代碼的速度提高30倍以上
毫無疑問,Python是社區最喜愛的編程語言!到目前為止,它是最容易使用的語言之一,因為python代碼是用一種直觀的、人類可讀的方式編寫的。
然而,你經常會反覆聽到一些對Python的抱怨,尤其是來自C語言愛好者的抱怨,這些抱怨無非就是Python很慢。
是的,他們並沒有說錯。
與許多其他編程語言相比,Python確實很慢。Benchmark game有一些比較不同編程語言在不同任務上的速度的可靠基準。
對於Python,我們有幾種不同的方法可以加快速度:
如果你所做的實際上可以並行化,比如數據預處理或矩陣運算,這些都是很好的方法。
但是如果你的代碼是純Python的呢?如果你不得不使用一個很大的for循環,且不能將數據放入矩陣中,因為數據必須按順序處理,那會怎樣?有沒有辦法加快Python本身的速度呢?
答案是肯定的,這就是Cython來加速原生Python代碼的地方。
什麼是Cython?
Cython是Python和C/C++之間的一個中間步驟。它允許你編寫純Python代碼,並且只需要做一些小修改,然後將其直接翻譯成C代碼。
使用Cython,我們將向該變數添加一個類型:
安裝Cython只需要一行簡單的pip命令:
Cython中的類型
使用Cython時,變數和函數分別有不同的類型。
對於變數我們有以下類型:
注意所有這些類型都來自C/C++ ! 而對於方法我們有以下類型:
了解了Cython類型之後,我們就可以直接實現加速了!
如何使用Cython加速你的代碼
我們要做的第一件事是設置Python代碼基準:用於計算數值階乘的for循環。原生Python代碼如下:
注意到該函數具有cpdef,以確保我們可以從Python中調用它。並且注意到到循環變數i是具有類型的。你需要為函數中的所有變數設置類型,以便C編譯器知道使用哪種類型!
接下來,創建setup.py文件,該文件將Cython代碼編譯為C代碼:
並執行編譯:
Boom ! 可以看到我們的C代碼已經編譯好了,可以使用了!
你將看到,在Cython代碼所在的文件夾中,你擁有運行C代碼所需的所有文件,包括run_cython.c文件。如果你感興趣,可以查看一下Cython生成的C代碼!
現在我們準備測試我們新的並且超級快的C代碼!查看下面的代碼,它實現了一個速度測試,將原生Python代碼與Cython代碼進行比較。
代碼非常直觀,我們以與普通Python相同的方式導入文件,並以與普通Python相同的方式運行函數!
Cython幾乎可以讓你在所有原生Python代碼上獲得良好的加速,而不需要太多額外的工作。需要注意的關鍵是,循環次數越多,處理的數據越多,Cython可以提供的幫助就越多。
下表顯示了Cython為不同的數值階乘帶來的加速性能。當數值為10000000的時候,可以看到,我們的Cython加速超過了36倍。
python語言運行速度如此差?
這就要說到 Python 類語言和 C 類語言的主要區別了,Python 屬於解釋型語言,通俗來說就是你可以一句一句地輸入,而 Python 解釋器(Interpreter)可以一句一句地執行,而 C 語言屬於編譯型語言,無法做到這一點,只能一次性輸入完成,編譯成一個完整的程序再執行,而這個編譯的過程由於現代編譯器做了非常多的優化,並且你的程序沒有輸入只有輸出,每次運行都出固定的結果,所以極有可能被編譯器優化成為了只有一條輸出語句(實際情況可能要複雜一些),總的來說就是由於二者之間原理的差異導致了性能的差異,你可以搜一搜相關的資料,關掉 C 語言編譯時的優化,再看一下性能,或者將固定的那些值改為運行時需要輸入再看一下效果。
Python 相較於 C 的優勢有很多,性能這一方面你不需要關心,做出一個足夠複雜的程序,它們之間運行效率差不了多少的。
原創文章,作者:ZKAR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/135462.html