假设我有一个班级:
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
。
答案 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
获得一些定时结果:
10000个循环,最佳3:每循环95.8μs
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'的内存位置。但是我不怀疑你会从中获得很多性能。