簡體   English   中英

為什么Python3.6的結果比3.7好?

[英]Why Python3.6 showing better results than 3.7?

我有以下代碼(它無用,僅用於性能測試)

class A:
    def __init__(self, i):
        self.i = i

start = datetime.now()
foo = {}
for i in range(10000000):
    foo[i] = A(i)

print('\nSpent: [ {} ] seconds!'.format((datetime.now()-start).total_seconds()))

事實是,當我用Python3.7運行它時,得到以下結果

Spent: [ 7.644764 ] seconds!

但是當我用Python3.6運行它時

Spent: [ 6.521555 ] seconds!

所以問題是,我是否會誤解某些東西,還是舊版本的python速度更快,應該使用舊版本的python?

UPD:如評論中所建議,我使用了timeit模塊,這里是結果

python3.7 -m timeit '"-".join(str(n) for n in range(2000000))'
1 loop, best of 5: 499 msec per loop

python3.6 -m timeit '"-".join(str(n) for n in range(2000000))'
10 loops, best of 3: 405 msec per loop

timeit的結果對於3.7來說仍然是不好的,真的比3.6慢嗎?

您的計時方法有缺陷。 在6到7秒鍾內,現代操作系統不會為Python提供對CPU的獨占訪問權,其他事情也在發生,因為操作系統在進程之間切換,刷新磁盤緩沖區以寫入文件,執行計划的網絡事件等。

您還會生成很多都已加載到內存中的對象,因此Python必須向OS詢問要分配的其他內存頁面。 這取決於您的計算機在當時還能執行多快的速度。 看來您運行了Python 3.6秒,因此很可能是釋放的內存和重新分配給Python 3.7運行的內存仍可用於3.6運行,並且最近釋放的內存更容易為OS重新分配。

接下來,您使用了一個不太精確的掛鍾計時器來計時您的演奏。 datetime.now()對於想知道當前時間的人來說是不錯的選擇,而對於衡量性能來說則不合適。 對於后者,Python有更好,更專業的時鍾可用。 Python本身也有一個稱為垃圾收集器的后台進程,該進程還將希望花一些時間來完成其工作,從而影響Python執行給它的任務的方式。

相反,您需要將Python必須在此處解決的不同問題分開進行單獨的測試。 在受控的情況下,使用准確的時鍾並在盡可能多的干擾下禁用它們,來運行這些單獨的測試。 多次運行這些測試然后花費平均時間(如果您只有可用的匯總)或多次重復的最佳時間。

Python為此提供了一個庫,稱為timeit 使用它創建實例,也不將其全部存儲在字典中。 如前所述,內存分配取決於操作系統的時間,而不是Python的時間。 確保繼續重復測試; 如果-m timeit您真的不信任計時-m timeit運行測試,請減少基准測試中完成的工作。

接下來,如果您的目標是按照常規性能而非特定的微基准來比較Python 3.6與3.7,那么您將需要進行廣泛的測試。 Stuff始終從3.x更改為3.x + 1版本。 不要以單個字符串連接或實例創建測試為基礎。 並且知道Python開發人員已經完成了所有工作。 請參閱https://speed.python.org/以獲取核心團隊用來監視性能的全套基准測試和計時,或參閱PyPerformance套件以獲取另一種此類基准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM