18

指数関数的に増加する値を使用して、一部のコードのパフォーマンスをテストしたいと考えています。numbers_size に余分な数字が追加されると、インクリメントが 10 倍になります。非標準ライブラリを導入せずに改善するための提案はありますか?

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
4

8 に答える 8

23

numpy を標準の 1 つと見なす場合 ;)、numpy.logspaceを使用することができます。

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

例 2 (注: 100=10^2、1000000000=10^9、ステップ 10x で移動したい、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)

于 2015-08-10T12:45:39.853 に答える
15

なぜだめですか

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

私があなたの意図を正しく読んでいるなら。

于 2012-07-12T01:12:33.800 に答える
14

コードと同じ番号を生成するには:

numbers_sizes = (i*10**exp for exp in range(2, 9) for i in range(1, 10))
for n in numbers_sizes:
    test(n)
于 2012-07-12T01:35:34.730 に答える
5

最も簡単な方法は、指数の線形シーケンスを使用することです。

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)
于 2012-07-12T01:11:43.623 に答える
5

私はNed 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
于 2012-07-12T01:25:28.567 に答える
0

ジェネレータ式の使用:

max_exponent = 100
for i in (10**n for n in xrange(1, max_exponent)):
    test(i)
于 2012-07-12T01:16:04.480 に答える
-2

「質問を正しく読んでいない」および「それを行う方法ではない」の例

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

それが得るのと同じくらい簡単です...xrangeそれに応じて調整してください

于 2012-07-12T01:09:36.247 に答える