在分析我的Python應用程序時,我發現len()
在使用集合時似乎是非常昂貴的。請參見下面的代碼:在Python 3中剖析len(set)與set .__ len __()的性能
import cProfile
def lenA(s):
for i in range(1000000):
len(s);
def lenB(s):
for i in range(1000000):
s.__len__();
def main():
s = set();
lenA(s);
lenB(s);
if __name__ == "__main__":
cProfile.run("main()","stats");
根據下面分析器的統計,lenA()
似乎比lenB()
慢14倍:
ncalls tottime percall cumtime percall filename:lineno(function)
1 1.986 1.986 3.830 3.830 .../lentest.py:5(lenA)
1000000 1.845 0.000 1.845 0.000 {built-in method len}
1 0.273 0.273 0.273 0.273 .../lentest.py:9(lenB)
我缺少的東西?目前我使用__len__()
,而不是len()
,但代碼看上去很髒:(
你爲什麼用'cProfile'而不是'timeit'?前者是爲了在大型程序中尋找瓶頸,併爲小規模犧牲一些準確性。後者用於相對精確地測量小片段的整體性能。 'timeit'應該是像這樣的微基準的首選。對我而言,它表示一個較小的差異(每個「len」調用0.0879μs,每個「.__ len__」調用0.158μs=「len」減慢70%)。 – delnan 2012-01-08 15:33:49
謝謝@delnan,我在Python中很新。使用'timeit'我也得到了類似的比例。事實上,我的程序比上面的代碼大得多,但是讓我感到驚訝的是'len()'函數是主要的瓶頸之一。好的,所以我會忽略'len()'並專注於我自己的功能,對吧? – Tregoreg 2012-01-08 15:56:59