构建平行列表的Pythonic模式

2024-09-25 08:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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方法让我感到困惑。我正在编写很多对任何特定循环或片段都不是超级性能敏感的文本解析代码,因为所有的性能实际上都包含在gensimNLTK代码中,而且比我的能力强得多。你知道吗

做这种手术有更好的/更具脓性的模式吗?你知道吗


Tags: or代码inforfoodef模式some
2条回答

首先,列表理解可能是您所需要的全部(如果您的评论中提到的所有处理都发生在operation)。你知道吗

def foo(list):
    return [operation(n) for n in list]

如果列表理解在您的情况下不起作用,请考虑foo是否真的需要构建列表,并且可以作为生成器。你知道吗

def foo(list):
    for n in list:
        # Processing...
        yield operation(n)

在这种情况下,您可以迭代序列,并根据需要计算每个值:

for x in foo(myList):
   ...

或者您可以让呼叫者决定是否需要完整的列表:

results = list(foo())

如果以上两种方法都不合适,那么在循环体中建立返回列表是完全合理的。你知道吗

[..] so calling append each time seems like it might be causing memory fragmentation, or performance problems, but I am also wondering if that is just my old C ways tripping me up.

如果您担心这个问题,请不要这样做。当需要重新调整列表的大小时(列表根据其大小动态调整大小),Python会过度分配,以便执行O(1)追加。无论是手动调用list.append,还是使用列表理解构建它(它在内部也使用.append),记忆方面的效果都是相似的。你知道吗

列表理解的性能(速度方面)要好一点;它是为创建带有专门字节码指令的列表而优化的,这些指令可以帮助它(LIST_APPEND主要是直接调用lists append in C)。你知道吗

当然,如果内存使用是个问题,您可以选择chepners答案中突出显示的生成器方法来懒散地生成结果。你知道吗


最后,for循环仍然很棒。与理解和map相比,它们可能显得笨拙,但它们仍然提供了一种可识别和可读的方式来实现目标。for环路也值得我们的爱。你知道吗

相关问题 更多 >