2013-06-25 24 views
-2

我對Python有一些麻煩。 我正在用Python解決一些編程任務(topcoder,codeforces)。有時我需要計算一些東西。例如:在字符串或其他東西中計數子字符串。當我計算如下:使用python編號的高效工作

counter += 1 

我的解決方案在某些測試失敗。我調查了這一點,發現我的代碼應該算在200000附近。我知道Python中的數字是對象。而我的代碼試圖創建這個200000個對象,因此測試時間限制已經超過了。在一個任務中,我能夠優化算法,並最終要求完全降低加法。但在另一箇中,這是不可能的,我的代碼失敗了,因爲它應該創建許多數字對象。 我的主要語言是C#,所以我想知道,我應該如何以有效的方式使用Python數字?

我在那裏找不到任何類似的問題,所以我在問問題。

+2

什麼是你的代碼中失敗的任務? –

+4

我認爲這不是事實,你在Python中編碼意味着你超時,但是你的算法複雜度太低,這意味着你超時(例如問題期望一個O(nlogn)複雜性解決方案和設置超時,使得即使在Python中任何O(nlogn)都可以使它成爲O(n^2)甚至可以使它成爲C++。 – Patashu

+0

我應該計算字符串中的子字符串。 –

回答

3
$ python -m timeit 'counter = 0 
> for _ in xrange(200000): counter += 1' 
100 loops, best of 3: 9.25 msec per loop 

不要小於10毫秒爲您的測試,如此大的差異?我不這麼認爲。

最有可能是counter += 1指令是不是的瓶頸。您可能有錯誤的算法,或者您以錯誤的方式實施算法。


使用while

$ python -m timeit 'counter = 0 
> while counter < 200000: counter += 1' 
100 loops, best of 3: 10.5 msec per loop 
+0

使用生成器函數('xrange')是展示這個時間的一個壞方法。你應該使用裸體while循環測試(計數器<20000)。發生器至少會創建棧幀開銷。 –

+1

@PreetKukreti那麼,什麼?如果他們的開銷超過了這個數字,那麼意味着'9.25毫秒'是一個鬆散的「推翻」,這使得我的觀點更加重要:問題不在於計數器,而在於循環。順便說一句:在Python中,while循環比for循環慢(見更新的答案)。 – Bakuriu

+1

@Bariku好點,它實際上強調你的論點。另外我看到我的建議實際上比xrange慢。所以看來我錯了。後面的另一個教訓,後面擔心:)。 +1 –