在同一个类的实例列表中提取相同成员的最快方法

时间:2017-03-16 20:59:13

标签: python performance list class

这是一个高性能的Python问题:

我的同事给了我一份Foo类实例的清单。

class Foo(object):
  def __init__(self): 
    stuff
    ...
    self.spam = random number
    ....

列表很大,我关心的是每个实例中的 spam 元素。我想把它们放在一个列表中。现在我做这个工作正常但很慢:

mySpams = [None] * len(lFoos)
for myFoo in range(len(lFoos)):
    mySpams[myFoo] = lFoos[myFoo].spam

问题是如何快速做到这一点。

3 个答案:

答案 0 :(得分:4)

您可以使用列表理解来提取Foo列表中每个lFoos对象的垃圾邮件属性:

new_list = [foo_obj.spam for foo_obj in lFoos]

答案 1 :(得分:2)

不确定如何比以下更快:

[foo.spam for foo in lFoos]

答案 2 :(得分:1)

class Foo():
    def __init__(self, val):
         self.val = val
lFoo = [Foo(i) for i in range(1000)]
%timeit [f.val for f in lFoo]

10000 loops, best of 3: 52.5 µs per loop

%timeit list(map(lambda f: f.val, lFoo))

10000 loops, best of 3: 114 μs per loop