Python 在这种情况下,为什么while循环比range快得多?
根据这一点,范围循环应该比python中的while循环快,但是请看下面的代码。它只是用来测试一个数是否为素数,如果n不是素数,则返回除数Python 在这种情况下,为什么while循环比range快得多?,python,loops,Python,Loops,根据这一点,范围循环应该比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 rang
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))
导入时间
def isPrimeWhile(n):
i=2
由于您使用的是Python2+(您的代码需要使用整数除法才能在Python3+中工作),因此您遇到了这样一个事实:Python2+range
生成了所有元素的列表,然后对它们进行迭代
这将解释while
和range
函数运行所需的时间差异
另外,Python 3+的代码需要进行以下更改:
def isPrimeRange(n):
for i in range(2,n//2+1): # integer division
if(n%i == 0):
return i
return n
详细说明Python 2+中range
(返回列表)和xrange
(返回迭代器)之间的区别,以及Python 3+如何更改此功能
从该来源中挑选最相关的段落如下:
当您使用迭代器时,for语句的每个循环都会动态生成下一个数字。而原始range()函数在for循环开始执行之前会即时生成所有数字。原始range()的问题函数的作用是,它在生成大量数字时使用了非常大的内存。但是,使用少量数字往往会更快。请注意,在Python 3.x中,您仍然可以通过将返回的生成器传递给list()函数来生成列表
你不妨尝试使用
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 xrange(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 while seconds"%(time.time() - start))
导入时间
def isPrimeWhile(n):
i=2
虽然(i如其他人所述,主要问题似乎是在Python2.7中使用range
而不是range
。使用%timeit
,如果使用xrange
(Python2.7),两个函数几乎相同
isprimerage:Line Profiler
%lprun -f isPrimeRange isPrimeRange(n)
Timer unit: 1e-06 s
**Total time: 5.5e-05 s**
File: isPrimeRange.py
Function: isPrimeRange at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def isPrimeRange(n):
2 82 25 0.3 45.5 for i in xrange(2,n/2+1):
3 82 29 0.4 52.7 if(n%i == 0):
4 1 1 1.0 1.8 return i
5 return n
%lprun -f isPrimeWhile isPrimeWhile(n)
Timer unit: 1e-06 s
**Total time: 9e-05 s**
File: isPrimeWhile.py
Function: isPrimeWhile at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 def isPrimeWhile(n):
4 1 1 1.0 1.1 i = 2
5 82 34 0.4 37.8 while(i <= n/2+1):
6 82 31 0.4 34.4 if(n%i == 0):
7 1 0 0.0 0.0 return i
8 81 24 0.3 26.7 i += 1
9 return n
%mprun -f isPrimeRange isPrimeRange(n)
('',)
Filename: isPrimeRange.py
Line # Mem usage Increment Line Contents
================================================
1 24.2 MiB 0.0 MiB def isPrimeRange(n):
2 24.2 MiB 0.0 MiB for i in xrange(2,n/2+1):
3 24.2 MiB 0.0 MiB if(n%i == 0):
4 24.2 MiB 0.0 MiB return i
5 return n
%mprun -f isPrimeWhile isPrimeWhile(n)
('',)
Filename: isPrimeWhile.py
Line # Mem usage Increment Line Contents
================================================
3 24.2 MiB 0.0 MiB def isPrimeWhile(n):
4 24.2 MiB 0.0 MiB i = 2
5 24.2 MiB 0.0 MiB while(i <= n/2+1):
6 24.2 MiB 0.0 MiB if(n%i == 0):
7 24.2 MiB 0.0 MiB return i
8 24.2 MiB 0.0 MiB i += 1
9 return n
isPrimeWhile:Line Profiler
%lprun -f isPrimeRange isPrimeRange(n)
Timer unit: 1e-06 s
**Total time: 5.5e-05 s**
File: isPrimeRange.py
Function: isPrimeRange at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def isPrimeRange(n):
2 82 25 0.3 45.5 for i in xrange(2,n/2+1):
3 82 29 0.4 52.7 if(n%i == 0):
4 1 1 1.0 1.8 return i
5 return n
%lprun -f isPrimeWhile isPrimeWhile(n)
Timer unit: 1e-06 s
**Total time: 9e-05 s**
File: isPrimeWhile.py
Function: isPrimeWhile at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 def isPrimeWhile(n):
4 1 1 1.0 1.1 i = 2
5 82 34 0.4 37.8 while(i <= n/2+1):
6 82 31 0.4 34.4 if(n%i == 0):
7 1 0 0.0 0.0 return i
8 81 24 0.3 26.7 i += 1
9 return n
%mprun -f isPrimeRange isPrimeRange(n)
('',)
Filename: isPrimeRange.py
Line # Mem usage Increment Line Contents
================================================
1 24.2 MiB 0.0 MiB def isPrimeRange(n):
2 24.2 MiB 0.0 MiB for i in xrange(2,n/2+1):
3 24.2 MiB 0.0 MiB if(n%i == 0):
4 24.2 MiB 0.0 MiB return i
5 return n
%mprun -f isPrimeWhile isPrimeWhile(n)
('',)
Filename: isPrimeWhile.py
Line # Mem usage Increment Line Contents
================================================
3 24.2 MiB 0.0 MiB def isPrimeWhile(n):
4 24.2 MiB 0.0 MiB i = 2
5 24.2 MiB 0.0 MiB while(i <= n/2+1):
6 24.2 MiB 0.0 MiB if(n%i == 0):
7 24.2 MiB 0.0 MiB return i
8 24.2 MiB 0.0 MiB i += 1
9 return n
isPrimeWhile:Memory Profiler
%lprun -f isPrimeRange isPrimeRange(n)
Timer unit: 1e-06 s
**Total time: 5.5e-05 s**
File: isPrimeRange.py
Function: isPrimeRange at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def isPrimeRange(n):
2 82 25 0.3 45.5 for i in xrange(2,n/2+1):
3 82 29 0.4 52.7 if(n%i == 0):
4 1 1 1.0 1.8 return i
5 return n
%lprun -f isPrimeWhile isPrimeWhile(n)
Timer unit: 1e-06 s
**Total time: 9e-05 s**
File: isPrimeWhile.py
Function: isPrimeWhile at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 def isPrimeWhile(n):
4 1 1 1.0 1.1 i = 2
5 82 34 0.4 37.8 while(i <= n/2+1):
6 82 31 0.4 34.4 if(n%i == 0):
7 1 0 0.0 0.0 return i
8 81 24 0.3 26.7 i += 1
9 return n
%mprun -f isPrimeRange isPrimeRange(n)
('',)
Filename: isPrimeRange.py
Line # Mem usage Increment Line Contents
================================================
1 24.2 MiB 0.0 MiB def isPrimeRange(n):
2 24.2 MiB 0.0 MiB for i in xrange(2,n/2+1):
3 24.2 MiB 0.0 MiB if(n%i == 0):
4 24.2 MiB 0.0 MiB return i
5 return n
%mprun -f isPrimeWhile isPrimeWhile(n)
('',)
Filename: isPrimeWhile.py
Line # Mem usage Increment Line Contents
================================================
3 24.2 MiB 0.0 MiB def isPrimeWhile(n):
4 24.2 MiB 0.0 MiB i = 2
5 24.2 MiB 0.0 MiB while(i <= n/2+1):
6 24.2 MiB 0.0 MiB if(n%i == 0):
7 24.2 MiB 0.0 MiB return i
8 24.2 MiB 0.0 MiB i += 1
9 return n
%mprun-f isPrimeWhile isPrimeWhile(n)
('',)
文件名:isPrimeWhile.py
行#内存使用增量行内容
================================================
3 24.2 MiB 0.0 MiB def isPrimeWhile(n):
4 24.2 MiB 0.0 MiB i=2
5 24.2 MiB 0.0 MiB(我在使用Python 2吗?):顺便说一下,下一次你应该考虑使用这种东西。它可以提供更精确的结果,因为它可以运行几千个样本并编译统计数据。看起来XRead更快。0.00万129S> 0.00万69-跟踪:Python 3上的已调整代码,并且使用该模块,我得到18个S。代码>+=1
版本,对于范围
版本为8µs。我从未见过那些%
命令…是IPython吗?那行和内存分析也很酷,很好。