如何在Python中生成指数增长的范围

时间:2012-07-12 01:04:06

标签: python

我想使用指数增加的值来测试某些代码的性能。因此,当一个额外的数字被添加到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

8 个答案:

答案 0 :(得分:12)

为什么不

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

如果我正在读你的意图。

答案 1 :(得分:10)

如果你认为numpy是其中一个标准;),你可以使用numpy.logspace,因为它正是它应该做的......(注意:100 = 10 ^ 2,1000000000 = 10 ^ 9)

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])

示例2(注意:100 = 10 ^ 2,1000000000 = 10 ^ 9,想要步进10x,它是9-2 + 1分......):

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])

示例3:

endpoint=False

根据您的情况,我们使用np.logspace(2,9,num=9-2, endpoint=False),因为您不想包含端点...(例如model['field']

答案 2 :(得分:8)

生成与代码相同的数字:

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

答案 3 :(得分: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)

答案 4 :(得分:3)

我喜欢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

答案 5 :(得分:1)

OP写道&#34;建议改进而不引入非标准库?&#34;

为了完整起见,这里有一个产生指数范围的方法:

from math import exp
from math import log

def frange(start, stop, numelements):
    """range function for floats"""
    incr = (stop - start) / numelements
    return (start + x * incr for x in range(numelements))

def exprange(start, stop, numelements):
    """exponential range - each element is a fixed factor bigger than the previous"""
    return (exp(x) for x in frange(log(start), log(stop), numelements))

测试:

print(", ".join("%.3f" % x for x in exprange(3,81,6)))

输出:

3.000, 5.196, 9.000, 15.588, 27.000, 46.765

答案 6 :(得分:0)

使用生成器表达式:

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

答案 7 :(得分:-1)

'没有正确阅读问题'和'不怎么做'的例子

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

就像它一样简单......相应地调整xrange