2017-07-04 34 views
3

假設我有一個類:在蟒蛇許多情況下大規模分配

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

我不知道你怎麼能比循環做得更好。你總是需要迭代列表。 –

+0

@DanielRoseman當你做[a,b] = [1,2]你不會循環任何東西 –

+0

呃,是的。這與此有什麼關係? –

回答

2

有沒有在Python更好的方法嗎?我的意思是。更高的性能

我不相信這是我們做了幾定時實驗首先,考慮執行的任務的另一種方式:您可以使用一個設置爲類,並調用二傳手在理解/地圖內

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

,你可以這樣做:

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

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

list(map(f, fooList, propList)) 

可正常工作。我們可以用timeit得到一些定時結果與N = 1000

  1. For循環的方法

10000圈,最好的3:每循環

  • 地圖方式
  • 1000次循環,最好的3:每圈199微秒

    結論:看來,通過計時的2倍不同我相信沒有什麼可以打敗一個for循環這一特定用例,它是語言的語法,比使用任何函數都快。

    +0

    @JimFasarakisHilliard謝謝你的建議。 –

    +0

    好多了。它表明有時候,簡單易讀的方法是最好的。 –

    -1

    你可能會得到一些改進的一種方法是假設你已經將你的類變量保存到一個python兼容的dict中(想一想pickle)。然後,你可以做的做同樣的事情到

    Foo.__dict__ = loaded_dict_value 
    

    這可能比你提出的方法更快,因爲這樣的事實,

    Foo.value = loaded_value 
    

    等效於Foo.__dict__['value'] = loaded_value。這意味着多了一個搜索(對於__dict__「價值」的存儲位置。但是我不懷疑你將獲得多少表現出了這一點。

    +0

    等一下,'Foo .__ dict__'是* class *字典,而不是實例。 –

    +0

    是的。我正在尋找顯式顯示實例的類型。 foo_instance .__ dict__會爲您提供實例中包含的參數。 –