【发布时间】:2016-12-13 18:17:47
【问题描述】:
我是 Python 新手,我发现我一遍又一遍地编写相同模式的代码:
def foo(list):
results = []
for n in list:
#do some or a lot of processing on N and possibly other variables
nprime = operation(n)
results.append(nprime)
return results
我正在特别考虑创建空列表,然后是 append 调用。有没有更 Pythonic 的方式来表达这种模式? append 可能没有最好的性能特征,但我不确定在 Python 中我还能如何处理它。
我经常确切地知道我的输出的长度,所以每次调用append 似乎可能会导致内存碎片或性能问题,但我也想知道这是否只是我以前的C 方式让我绊倒向上。我正在编写很多文本解析代码,这些代码对任何特定的循环或片段都不是超级性能敏感,因为所有性能实际上都包含在 gensim 或 NLTK 代码中,并且比我更有能力。
是否有更好/更 Pythonic 的模式来执行这种类型的操作?
【问题讨论】:
-
重复追加没问题。尝试预先分配您的列表,虽然可能,但不太可能提供实质性的性能改进,并且可能很容易减慢速度。
-
你的意思是额外的处理排除了使用列表理解
return [operation(n) for n in list]? -
取决于
some or a lot of processing、list comprehensions 或其近亲生成器表达式的数量,可以比简单的 for 循环提供速度或内存优势。但是,如果some or a lot of processing超过一两行代码,那么 for 循环肯定会在可读性和可维护性方面胜出。 -
如果处理不像@chepner 建议的那样完全适合列表理解,那么您的 for 循环方法是下一个最佳选择。
-
处理肯定不适合循环理解。
标签: python list python-3.x