2013-03-17 44 views
17

每學期我有誰使用dict.update至少一個Python的學生()來添加一個鍵/值對,即:蟒蛇dict.update與標增加一個鍵/值對

mydict.update({'newkey':'newvalue'}) 

代替

mydict['newkey'] = 'newvalue' 

我不教這個方法,我不知道他們去哪裏找到這樣的例子,但我告訴他們不要做,因爲它的效率較低(大概是創建一個新的2元素字典),因爲它是非標準的。

老實說,我可以理解使用可見方法而不是這種語法的願望 - 它可能與其他方法調用更加一致。但我認爲這看起來像一個新手方法。

在這一點上,任何人都不能提供任何智慧嗎?

+3

你的問題是什麼?你只是問這樣使用'update'是否是好的/壞主意? – BrenBarn 2013-03-17 00:01:36

+0

我認爲這是一個要求*編程*問題的地方 - 並不是真正提出*教學編程問題的地方。因此,這可能會很快關閉。祝你好運,但你的搜索。 – mgilson 2013-03-17 00:06:21

+1

是的 - 和原因。這不是一個教學問題。這是一個問題,這種方法是否低效,不可取,等教學部分只是一些背景。感謝您的意見 – 2013-03-17 00:09:49

回答

19

基準測試顯示了你對性能的影響的懷疑似乎是正確的:

$ python -m timeit -s 'd = {"key": "value"}' 'd["key"] = "value"' 
10000000 loops, best of 3: 0.0741 usec per loop 
$ python -m timeit -s 'd = {"key": "value"}' 'd.update(key="value")' 
1000000 loops, best of 3: 0.294 usec per loop 
$ python -m timeit -s 'd = {"key": "value"}' 'd.update({"key": "value"})' 
1000000 loops, best of 3: 0.461 usec per loop 

也就是說,這是我的機器上大約慢六倍。但是,如果您需要最佳性能,Python已經不是您要使用的語言,所以我只是建議使用在這種情況下最具可讀性的內容。對於很多事情,這將是[]方式,雖然update可能是在這樣的情況下更易讀:

configuration.update(
    timeout=60, 
    host='example.com', 
) 

…或類似的東西。

+0

執行索引更新所用的時間在任何有意義的應用程序中都是不相關的。 [] = s的可讀性更重要。我發現更新版本不太明顯。 – 2013-03-17 00:15:05

+0

@PeterWooster:我同意可讀性更重要,但是我個人發現'update'更具可讀性。 – icktoofay 2013-03-17 00:16:24

+0

但你可能從來沒有寫過Fortran :) – 2013-03-17 00:18:48

2

更新的關鍵是直接三次一樣快,但情況因人而異:

$ python -m timeit 'd={"k":1}; d.update({"k":2})' 
1000000 loops, best of 3: 0.669 usec per loop 

$ python -m timeit 'd={"k":1}; d["k"] = 2' 
1000000 loops, best of 3: 0.212 usec per loop 
+0

好了,謝謝!我需要開始使用timeit – 2013-03-17 00:07:39

0

有些人誰覺得[] =不是面向對象的語言有效的語法元素,或任何其他爲此事。我記得幾十年前我在APL語言開發方面工作時聽到過這個論點。該語法是來自Fortran的保留...

我不親自訂閱該視圖,並且對索引賦值非常滿意。但有些人認爲真正的方法調用更好。當然,擁有多個解決方案總是很好的。

編輯: 這裏的真正問題是可讀性,而不是性能,索引賦值一直存在,因爲許多人發現賦值更容易閱讀,即使理論上不夠正確。