我正在尝试使用python对另一个代码进行一些参数测试.我需要测试6个独立的参数,但我需要它们的所有可能组合.
每个参数都有一个最小值,一个最大值和一个需要传递给它的步长值.突然出现在我脑海中的第一个简单的解决方案是嵌套的for循环结构,看起来很可怕,如下所示:
for var1 in xrange(min1,max1,step1):
for var2 in xrange(min2,max2,step2):
...
...
...
for var6 in xrange(min6,max6,step6):
'''
Do something and be icky in the process due
to being in the middle of six nested for loops
'''
Run Code Online (Sandbox Code Playgroud)
我决定了,不!这不能成立.所以我一直试图找到一种方法来递归地执行此操作,或者至少,不是嵌套六次.我无法真正想出一个好方案.对我来说最大的障碍是每个变量都有不同的最小值,最大值和步长值.
到目前为止,我的想法并不是很有帮助.我一直在尝试使一些递归函数工作,但是如果没有在函数中嵌套更多的循环,我就无法弄明白.我在这里看到了很多对itertools.product的引用,但我也无法弄清楚如何使这项工作成功.
编辑:我正在做的是创建一个以参数组合命名的目录,使用这些参数编写文件,使用此文件运行另一个代码,以及分析该代码的输出.除了最后一个,我几乎没有在for循环中做任何事情.很多参数只有2个值,有些有10个,有些有3个...它只是有点不同.
我想测试两个相同列表之间的处理时间,特别是正常列表和numpy列表.我的代码是
import timeit
import numpy as np
t = timeit.Timer("range(1000)")
print t.timeit()
u = timeit.Timer("np.arange(1000)")
print u.timeit()
Run Code Online (Sandbox Code Playgroud)
计算t很好,但对于uNameError:未列出全局名称'np'.
我应该如何编码以获得处理时间?
我想检查一下给定的是否在x这段时间内[0,a-1].作为一个懒惰的程序员,我写道
x in range(a)
Run Code Online (Sandbox Code Playgroud)
(因为那段代码在4.5嵌套循环中)很快就会遇到性能问题.我测试了它,事实上,它证明了n in range(n)O(n)中的谎言的运行时间,给予或接受.我实际上认为我的代码会被优化,x >= 0 and x < a但似乎并非如此.即使我range(a)事先修好了,时间也不会变得不变(虽然它会有很大改善) - 请参阅附注.
我应该使用x >= 0 and x < a而且永远不要再写x in range(a)了吗?有没有更好的写作方式?
附注:
如果我尝试以下:
i = range(a)
...
x in i
Run Code Online (Sandbox Code Playgroud)
所以范围是固定的,我只测量运行时间x in i,我仍然在O(x)中得到运行时(假设a足够大).
n in xrange(n)O(n)中的运行时间也是如此.在Python中,有一些简短的方法可以做类似的事情
"for i in range(n)"
当n太大而Python无法实际创建数组范围(n)?
(简短因为否则我只是使用while循环)
我做了几个测试,发现它xrange()比range()(通过各种问题/答案证实的)快得多:
>>> from timeit import timeit
>>> timeit(stmt = 'x = range(1000)', number = 10000)
0.38216601211680734
>>> timeit(stmt = 'x = xrange(1000)', number = 10000)
0.010537726631953959 # xrange is much faster than range
Run Code Online (Sandbox Code Playgroud)
我很好奇,所以我尝试了另一个测试,看看是否list(xrange(1000))仍然比简单更快range(1000):
>>> timeit(stmt = 'x = range(1000)', number = 10000)
0.3858838963796529
>>> timeit(stmt = 'x = list(xrange(1000))', number = 10000)
0.492734766028903 # now, xrange is slower
Run Code Online (Sandbox Code Playgroud)
对于更多呼叫也是如此:
>>> timeit(stmt = 'x = range(1000)', number = 100000)
3.6457308233315757
>>> timeit(stmt …Run Code Online (Sandbox Code Playgroud) 根据这篇文章,范围循环应该比python中的while循环更快,但请看下面的代码.它仅用于测试数字是否为素数,如果n不是素数则返回除数.
import time
def isPrimeWhile(n):
i = 2
while(i <= n/2+1):
if(n%i == 0):
return i
i += 1
return n
def isPrimeRange(n):
for i in range(2,n/2+1):
if(n%i == 0):
return i
return n
n = 353591872901
start = time.time()
isPrimeWhile(n)
print("%s while seconds"%(time.time() - start))
start = time.time()
isPrimeRange(n)
print("%s range seconds"%(time.time() - start))
Run Code Online (Sandbox Code Playgroud)
运行代码,你会发现while循环比range循环快得多.我猜测范围(0,aLargeNumber)需要很长时间才能运行.但为什么在上面提到的上一篇文章中,范围方法要快得多?任何答案?
我在这里尝试了它,但它无法打印这样的长数字
for i in range(1,222222222222222):
print i
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "x.py", line 1, in <module>
for i in range(1,222222222222222):
MemoryError
Run Code Online (Sandbox Code Playgroud) 我担心的是:
for i in range(1000000000):
...
Run Code Online (Sandbox Code Playgroud)
从一个幼稚的角度来看,我假设在循环开始之前分配并初始化了一个包含1000000000个整数的数组,并且仅在循环结束后才释放.
所以我想知道我是否应该用以下代替:
i = 0
while i < 1000000000:
...
i += 1
Run Code Online (Sandbox Code Playgroud)
但根据这个答案,for循环的执行速度比等效while循环快.
那么我是否必须接受这种权衡,或者我的假设是错误的,并且在迭代大量时没有显着的内存影响range?
生成器函数:
def getPositiveCount():
n = 0
while n<100:
yield n
n+=1
Run Code Online (Sandbox Code Playgroud)
上面的生成器函数在方法中调用时不会执行预期的操作next(..)。为什么next调用总是返回0?
print(next(getPositiveCount())) # prints 0
print(next(getPositiveCount())) # prints 0; should've printed 1
print(next(getPositiveCount())) # prints 0; should've printed 2
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其设置为循环,它就可以正常工作:
for i in getPositiveCount():
print(i)
# prints 0,1,2 ... 99
Run Code Online (Sandbox Code Playgroud)
这也让我再次问,生成器函数与生成器表达式(通常使用 range、xrange 或类似类型的内置函数)相同吗?例如,next生成器表达式中的调用完美地工作:
squares = (n** 2 for n in range(5))
print(next(squares)) # 0
print(next(squares)) # 1
print(next(squares)) # 4
Run Code Online (Sandbox Code Playgroud) alpha = [0,1,2,3,4,5,6,7,8,9]
for a in alpha:
for b in alpha:
for c in alpha:
for d in alpha:
print str(a) + str(b) + str(c) + str(d)
Run Code Online (Sandbox Code Playgroud)
上面的代码将生成0000到9999之间的所有数字.但是,我不喜欢代码的结构方式.假设我想这样做以产生最大十位数的数字; 这需要10个循环.有没有其他方法可以实现相同的结果,而无需插入无数的for循环?
python ×10
for-loop ×3
python-2.7 ×3
performance ×2
generator ×1
loops ×1
memory ×1
numpy ×1
overhead ×1
python-3.x ×1
range ×1
timeit ×1