在Python中汇总列表的最有效方法

时间:2016-02-01 05:13:10

标签: python performance python-2.x

在Python中获取整数列表A的方法有以下几种:

  1. 内置sum功能:sum(A)

  2. 使用加法器lambda减少函数:reduce(lambda x, y: x + y, A)

  3. 使用其中任何一个是否有任何速度优势,或者他们的表现大致相同?

2 个答案:

答案 0 :(得分:4)

  

在Python中获取整数列表A的总和的方法之一是   以下两点:

     

内置和函数:sum(A)

     

使用加法器lambda减少函数:reduce(lambda x,y:x + y,A)

     

使用其中任何一个是否有任何速度优势,或者是他们的   表演大致相同?

在我的机器上"总和"功能似乎比"减少"版本(至少对5000个1000大小的数组求和)。

请参阅:

$ cat doit.py   
from timeit import timeit
print timeit('reduce(lambda x, y: x + y, range(1000))',number=5000)
print timeit('sum(range(1000))',number=5000)

$ python2 doit.py
0.460000038147
0.0599999427795

更新: 为了解决这个问题,我已经更新了我的回答,还包括一个“设置”。用于创建要求和的数组:

$ cat doit2.py
from timeit import timeit

print timeit('reduce(lambda x, y: x + y, a)',setup='a=range(1000)',number=5000)
print timeit('sum(a)',setup='a=range(1000)',number=5000)

$ python2 doit2.py
0.530030012131
0.0320019721985

再次,"总和"版本似乎是明显的赢家。

答案 1 :(得分:2)

答案几乎肯定会因您使用的实施而异。但是,作为最佳实践,您应该假设内置函数具有最佳性能,除非您(a)另有证明并且(b)显示差异影响您的特定应用程序的性能。

这有两个互补的原因。首先,可以安全地假设实施该语言的人员关注绩效,并且他们会听到有关绩效的所有投诉(无论是否合理)。因此,如果有更好的实现,可以安全地假设它们将尽快更改为该实现。 如果一个更好的一个上线,你可以假设它们会改变。这意味着您可以免费获得速度提升,因为它们已被发现。 其次,可以安全地假设内置函数在代码库中比内联lambda更好地进行通信。阅读“sum”并理解“sum”比解析lambda更简单。由于程序员时间通常比CPU时间昂贵得多,因此除非有明确和具体的理由,否则总是优先考虑前者而不是后者。