使用元组预分配python列表?

时间:2014-04-16 20:45:19

标签: python list tuples

我还在Python中找出元组。如果我创建一个元组列表,我不能通过列表理解来完成,我是否应该使用某个对象预先分配列表?或者我应该在我继续时附加元组?我目前有:

def get_priorities(words):
    priorities = [0]*len(words)

    for idx, word in enumerate(words):

        # ...calculate priority using word...

        priorities[idx] = (word, priority)

    return set(priorities)

我应该只用[0]*len(words)替换[]并为循环中的每个项目附加一个元组吗?哪个会更快?我假设编译器必须在任一实例中重新分配存储。

4 个答案:

答案 0 :(得分:2)

我可能不完全了解您的用例,但我不确定您是否需要预先分配任何内容。通过执行以下操作,您不会得到相同的结果吗?

return set((word, calc_priority(word)) for word in words)

(当然,假设calc_priority()是一个已定义的函数)。

答案 1 :(得分:1)

为此,我将使用Python网站的时间复杂性:https://wiki.python.org/moin/TimeComplexity

使用append

def get_priorities(words):
    priorities = []
    for idx, word in enumerate(words):
        ...
        priorities.append(word, priority)
    return set(priorities)

这样可以节省预先分配大小数组的成本,在这种情况下需要O(nk)时间1 * len(words),但是您可以将其替换为根据Python文档{{}附加的成本。{ 1}}平均而言,其时间复杂度应为O(1),其中O(n)n循环的字词长度。

另一方面,使用for来节省内存/避免重读,同时保持相同的yield复杂度(What does the "yield" keyword do in Python?):

O(n)

我会争论第二种方法,因为你不需要为优先级列表分配内存或冒成附加费用的风险。但是,由于您使用的是def get_priorities(words): for idx, word in enumerate(words): ... yield (word, priority) ,我认为有些重复项目是您尝试消除的?然后使用set会为您的运行时间添加额外的set,因此在第一种情况下n使用产量O(2n)O(n)基本上是O(2n) {1}}运行时间。无论如何,如果将其分配为空列表,则在第一种情况下分配n的成本为priorities

答案 2 :(得分:0)

元组列表只是一个列表。没有必要以不同于使用字符串,整数或甚至更复杂的数据结构(如列表,字典或对象)的方式工作。有关列表和列表理解的更多信息(使用示例),请查看here

从你给出的例子中我看到你要做的是构建一种字典,它将单词和优先级保存在列表中的某个索引处。我完全不明白你为什么要在完成后将所有内容转换成一个集合(逻辑上,列表中不能有两个具有相同索引的单词,因此不需要消除重复项。)

我不知道上面提到的代码的用例,但从它的外观来看,你会更好地使用字典,其中单词是键,值是优先级。这样也可以消除重复(字典不允许多个相同的键),并且在检索每个字的优先级时很容易使用。

答案 3 :(得分:0)

您可以同时使用这两个选项 如果要使用索引(priorities[idx] = (word, priority)),则必须使用n元素初始化列表。但是使用空列表(priorities = [])和append()的替代方案看起来会更好。我不希望这两种选择之间的速度有显着差异 顺便说一句,这个问题不是关于元组的。您可以将此列表与任何其他元素一起使用。