2012-07-12 60 views
7

我想使用指數遞增的值來測試某些代碼的性能。所以作爲一個額外的數字被添加到numbers_size的增量乘以10.這是我如何做到目前爲止,但它看起來有點hacky。在不引入非標準庫的情況下進行改進的建議?如何在Python中生成指數級遞增的範圍

numbers_size = 100 
increment = 100 
numbers_range = 1000000000 
while numbers_size < numbers_range: 
    t = time.time() 
    test(numbers_size) 
    taken_t = time.time() - t 
    print numbers_size, test, taken_t 

    increment = 10 ** (len(str(numbers_size))-1) 
    numbers_size += increment 
+0

你已經得到了答案,但我可以問爲什麼? – 2012-07-12 01:39:48

+0

要查看我在Python性能提示上發表的演講的搜索列表和詞典的區別。 – Martlark 2012-07-20 09:54:30

回答

7

要生成與您的代碼相同的號碼:

numbers_sizes = (i*10**exp for exp in range(2, 9) for i in range(1, 10)) 
for n in numbers_sizes: 
    test(n) 
-1

例如「不讀的問題正確」和「沒有怎麼辦呢

for i in xrange(100, 1000000000, 100): 
    # timer 
    test(i) 
    # whatever 

是因爲它得到一樣簡單......調整xrange相應

+0

這是downvoted(雖然不是我)大概是因爲你的範圍是線性的,而不是指數。 – msw 2012-07-12 01:14:30

+0

@msw公平點,做得好 - 謝謝,我會堅持我的錯誤(**閱讀正確的問題**和**不怎麼做**),但它留在社區作爲參考。 – 2012-07-12 01:23:15

+0

我連續向上提出了一些我認爲值得信賴的舊答案,原因有兩個:大多數我討厭「開車」的downvoters誰不麻煩解釋,我很欣賞誰貢獻的新人。至於爲什麼OP這麼做真的很難,我分享你的困惑,但不要指望我們會聽到那個。 – msw 2012-07-12 03:28:02

3

最簡單的方法是使用線性指數序列:

for e in range(1, 90): 
    i = int(10**(e/10.0)) 
    test(i) 

你可以抽象序列劃分自己的發電機:

def exponent_range(max, nsteps): 
    max_e = math.log10(max) 
    for e in xrange(1, nsteps+1): 
     yield int(10**(e*max_e/nsteps)) 

for i in exponent_range(10**9, nsteps=100): 
    test(i) 
12

爲什麼不

for exponent in range(2, 10): 
    test(10 ** exponent) 

如果我在讀你的意圖的權利。

0

使用生成器表達式:

max_exponent = 100 
for i in (10**n for n in xrange(1, max_exponent)): 
    test(i) 
3

我喜歡奈德Batcheldor的答案,但我會做多一點一般:

def exp_range(start, end, mul): 
    while start < end: 
     yield start 
     start *= mul 

那麼你的代碼變得

for sz in exp_range(100, 1000000000, 10): 
    t = time.time() 
    test(sz) 
    print sz, test(sz), time.time()-t 
7

如果你認爲numpy是其中的一個標準,那麼你可以使用numpy.logspace,因爲這正是它應該做的......(注意:100 = 10^2,1000000000 = 10^9 )

for n in numpy.logspace(2,9,num=9-2, endpoint=False): 
    test(n) 

例2(注:100 = 10^2,十億= 10^9,想去在步驟10倍,它是9-2 + 1個點...):

In[14]: np.logspace(2,9,num=9-2+1,base=10,dtype='int') 
Out[14]: 
array([  100,  1000,  10000,  100000, 1000000, 
     10000000, 100000000, 1000000000]) 

示例3:

In[10]: np.logspace(2,9,dtype='int') 
Out[10]: 
array([  100,  138,  193,  268,  372, 
       517,  719,  1000,  1389,  1930, 
      2682,  3727,  5179,  7196,  10000, 
      13894,  19306,  26826,  37275,  51794, 
      71968,  100000,  138949,  193069,  268269, 
      372759,  517947,  719685, 1000000, 1389495, 
      1930697, 2682695, 3727593, 5179474, 7196856, 
     10000000, 13894954, 19306977, 26826957, 37275937, 
     51794746, 71968567, 100000000, 138949549, 193069772, 
     268269579, 372759372, 517947467, 719685673, 1000000000]) 

對您的情況,我們使用endpoint=False,因爲您不想包含端點...(例如, np.logspace(2,9,num=9-2, endpoint=False)