同时分配许多实例'性能

时间:2017-07-04 14:05:33

标签: python python-3.x

假设我有一个班级:

class Foo:
    def __init__(self):
        self.prop = None

我需要这样做:

[foo1.prop, foo2.prop, ..., fooN.prop] = [prop_value1, prop_value2, ..., prop_value3]

显然,N总是不一样,所以我应该动态地做。第一种方法是使用for循环:

for foo, value in zip(foo_list, value_list):
    foo.prop = value

但问题是......在Python中有更好的方法吗?我的意思是性能更高。

顺便说一句,N > 1000

2 个答案:

答案 0 :(得分:2)

  

Python中是否有更好的方法?我的意思是更高的性能。

我不相信有。我们来做一些定时实验。首先,考虑一种执行作业的替代方法:您可以为您的班级使用setter,并在理解/地图中调用该setter。

class Foo:
    def __init__(self):
        self.prop = None
    def setProp(self, prop):
        self.prop = prop

现在,你可以这样做:

from functools import partial
f = partial(Foo.setProp)

fooList = [...]
propList = [...]

list(map(f, fooList, propList))

这可以按预期工作。我们可以使用timeit通过N = 1000获得一些定时结果:

  1. For loop approach
  2.   

    10000个循环,最佳3:每循环95.8μs

    1. 地图方法
    2.   

      1000次循环,最佳为3:每循环199μs

      结论:似乎时间相差2倍。我认为没有什么能比这个特定用例的for循环更好,它是语言的语法,比使用任何函数更快。

答案 1 :(得分:-1)

你可能会得到一些改进的一种方法是假设你已经将类变量保存到python兼容的dict中(想想pickle)。然后你可以做类似于

的事情
Foo.__dict__ = loaded_dict_value

由于事实

,这可能比您提出的方法更快
Foo.value = loaded_value 

相当于Foo.__dict__['value'] = loaded_value。这意味着再多一次搜索(对于__dict__中的'value'的内存位置。但是我不怀疑你会从中获得很多性能。