在分析我的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