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

如何在Python中生成指数增长范围,python,Python,我想用一个指数增长的值来测试一些代码的性能。因此,当一个额外的数字被加到数字上时,增量被乘以10。到目前为止,我就是这样做的,但它看起来有点粗糙。不引入非标准库的改进建议 numbers_size = 100 increment = 100 numbers_range = 1000000000 while numbers_size < numbers_range: t = time.time() test( numbers_size ) taken_t = time

我想用一个指数增长的值来测试一些代码的性能。因此,当一个额外的数字被加到数字上时,增量被乘以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
number\u size=100
增量=100
数字范围=100000000
当数字大小<数字范围:
t=time.time()
测试(数字和大小)
taked\u t=time.time()-t
打印数字\u尺寸、测试、拍摄\u t
增量=10**(长度(长度(数字大小))-1)
数字\u大小+=增量

例如“没有正确阅读问题”和“没有怎么做”

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

就这么简单。。。相应地调整
xrange

最简单的方法是使用指数的线性序列:

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)
为什么不呢

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

如果我读对了您的意图。

使用生成器表达式:

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

我喜欢Ned Batcheldor的答案,但我想让它更一般一些:

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

要生成与代码相同的数字,请执行以下操作:

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

如果你认为麻木是标准之一;你可以使用,因为这是它应该做的。。。。(注:100=10^2,1000000000=10^9)

示例2(注意:100=10^2,1000000000=10^9,要进行步骤10x,它是9-2+1点…):

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

OP写道“在不引入非标准库的情况下改进的建议?”

为了完整起见,这里有一个生成指数范围的方法-每个元素都是比前一个元素大的固定因子:

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))
测试:

输出:

3.000, 5.196, 9.000, 15.588, 27.000, 46.765

这被否决了(虽然不是我),大概是因为你的范围是线性的,而不是指数型的。@msw的观点很好,做得很好-谢谢你,我会坚持我的错误(正确阅读问题,而不是如何做)尽管如此,它仍然留在社区中供参考。我连续地对你的一些旧答案进行了更新,我认为这些答案值得使用,原因有二:我最讨厌那些不费事解释的“开车经过”的下层选民,我也很欣赏那些做出贡献的新来者。至于为什么这次行动会如此艰难,我和你一样感到困惑,但我不希望我们会听到回音。@msw非常感谢——虽然当然没有必要:)我发现这一点只是因为我想问一个关于熊猫的问题,除了这里,我找不到任何邮件列表/联系人。然后,有点上瘾了,分享我所知道的总是一件快乐的事,学习我不知道的东西也很棒:)如果我弄错了,好吧,我弄错了——我会把它放在下巴上——反正我不会把它放在个人身上。。。但是,谢谢:)您已经得到了答案,但是我可以问一下原因吗?为了了解搜索列表和字典的区别,我将在一次关于Python性能技巧的演讲中介绍。
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])
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