相关疑难解决方法(0)

避免嵌套for循环

我正在尝试使用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个...它只是有点不同.

python for-loop

26
推荐指数
2
解决办法
1万
查看次数

python中的timeit模块无法识别numpy模块

我想测试两个相同列表之间的处理时间,特别是正常列表和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'.

我应该如何编码以获得处理时间?

python numpy timeit

11
推荐指数
2
解决办法
5428
查看次数

在python 2中的`范围'构造---工作太慢

我想检查一下给定的是否在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)了吗?有没有更好的写作方式?


附注:

  1. 我试着搜索范围,python-2.7,性能标签放在一起,什么都没找到(与python-2.x相同).
  2. 如果我尝试以下:

    i = range(a)
    ...
    x in i
    
    Run Code Online (Sandbox Code Playgroud)

    所以范围是固定的,我只测量运行时间x in i,我仍然在O(x)中得到运行时(假设a足够大).

  3. n in xrange(n)O(n)中的运行时间也是如此.
  4. 我找到了这篇文章,它问python 3的类似问题.我决定在python 3上测试相同的东西,它通过测试就像没什么.我为python 2感到难过.

python performance range overhead python-2.7

5
推荐指数
1
解决办法
175
查看次数

python for loop range(bigint)

在Python中,有一些简短的方法可以做类似的事情

"for i in range(n)"

当n太大而Python无法实际创建数组范围(n)?

(简短因为否则我只是使用while循环)

python

3
推荐指数
1
解决办法
4572
查看次数

为什么list(xrange)比range()慢?

我做了几个测试,发现它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 performance python-2.7

2
推荐指数
1
解决办法
783
查看次数

在这种情况下,为什么while循环比范围快得多?

根据这篇文章,范围循环应该比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)需要很长时间才能运行.但为什么在上面提到的上一篇文章中,范围方法要快得多?任何答案?

python loops

2
推荐指数
1
解决办法
167
查看次数

我如何打印1-9999的数字?

我在这里尝试了它,但它无法打印这样的长数字

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)

python

1
推荐指数
1
解决办法
1239
查看次数

当范围很大时,"for/range"会占用大量内存吗?

我担心的是:

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

python memory for-loop python-2.7

1
推荐指数
1
解决办法
153
查看次数

为什么生成器函数在下一次调用时不起作用?

生成器函数:

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)

python generator python-3.x

1
推荐指数
1
解决办法
633
查看次数

迭代循环

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 for-loop

0
推荐指数
1
解决办法
380
查看次数