我想使用指数增加的值来测试某些代码的性能.因此,当一个额外的数字被添加到numbers_size时,增量乘以10.这就是我到目前为止这样做但看起来有点hacky.在不引入非标准库的情况下改进建议?
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
Run Code Online (Sandbox Code Playgroud)
ntg*_*ntg 15
如果你认为numpy是标准之一;),你可以使用numpy.logspace,因为它正是它应该做的......(注意:100 = 10 ^ 2,1000000000 = 10 ^ 9)
for n in numpy.logspace(2,9,num=9-2, endpoint=False):
test(n)
Run Code Online (Sandbox Code Playgroud)
例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])
Run Code Online (Sandbox Code Playgroud)
例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])
Run Code Online (Sandbox Code Playgroud)
在你的情况下,我们使用,endpoint=False因为你不想包括端点......(例如np.logspace(2,9,num=9-2, endpoint=False))
msw*_*msw 13
为什么不
for exponent in range(2, 10):
test(10 ** exponent)
Run Code Online (Sandbox Code Playgroud)
如果我正在读你的意图.
要生成与代码相同的数字:
numbers_sizes = (i*10**exp for exp in range(2, 9) for i in range(1, 10))
for n in numbers_sizes:
test(n)
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用指数的线性序列:
for e in range(1, 90):
i = int(10**(e/10.0))
test(i)
Run Code Online (Sandbox Code Playgroud)
您可以将序列抽象为它自己的生成器:
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)
Run Code Online (Sandbox Code Playgroud)
我喜欢 Ned Batcheldor 的回答,但我会让它更笼统一点:
def exp_range(start, end, mul):
while start < end:
yield start
start *= mul
Run Code Online (Sandbox Code Playgroud)
然后你的代码变成
for sz in exp_range(100, 1000000000, 10):
t = time.time()
test(sz)
print sz, test(sz), time.time()-t
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24482 次 |
| 最近记录: |