我是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
调用。有没有一种更像Python的方式来表达这种模式?append
可能没有最好的性能特性,但我不确定用Python如何处理它。你知道吗
我经常确切地知道输出的长度,所以每次调用append
似乎都会导致内存碎片或性能问题,但我也在想,这是否只是我以前的C
方法让我感到困惑。我正在编写很多对任何特定循环或片段都不是超级性能敏感的文本解析代码,因为所有的性能实际上都包含在gensim
或NLTK
代码中,而且比我的能力强得多。你知道吗
做这种手术有更好的/更具脓性的模式吗?你知道吗
首先,列表理解可能是您所需要的全部(如果您的评论中提到的所有处理都发生在
operation
)。你知道吗如果列表理解在您的情况下不起作用,请考虑
foo
是否真的需要构建列表,并且可以作为生成器。你知道吗在这种情况下,您可以迭代序列,并根据需要计算每个值:
或者您可以让呼叫者决定是否需要完整的列表:
如果以上两种方法都不合适,那么在循环体中建立返回列表是完全合理的。你知道吗
如果您担心这个问题,请不要这样做。当需要重新调整列表的大小时(列表根据其大小动态调整大小),Python会过度分配,以便执行
O(1)
追加。无论是手动调用list.append
,还是使用列表理解构建它(它在内部也使用.append
),记忆方面的效果都是相似的。你知道吗列表理解的性能(速度方面)要好一点;它是为创建带有专门字节码指令的列表而优化的,这些指令可以帮助它(
LIST_APPEND
主要是直接调用lists append inC
)。你知道吗当然,如果内存使用是个问题,您可以选择chepners答案中突出显示的生成器方法来懒散地生成结果。你知道吗
最后,
for
循环仍然很棒。与理解和map
相比,它们可能显得笨拙,但它们仍然提供了一种可识别和可读的方式来实现目标。for
环路也值得我们的爱。你知道吗相关问题 更多 >
编程相关推荐