[英]Python gets stuck when compiling
我编写了一个程序,查找最小的数字,该数字的每个数字都从1到20为整数。 我的C ++代码可完美运行,并找到正确的答案:
#include <iostream>
using namespace std;
int main(){
for( int i = 1; i < 300000000; i++ ){
int check = 1;
for( int j = 6; j <= 20; j++ ){
if( i % j == 0 ){
continue;
} else {
check = 0;
break;
}
}
if( check == 1 ){
cout << i << endl;
break;
}
}
}
但是,Python中的同一程序(仅当查找的范围是1到10的整数倍时才有效,但仅当搜索的范围较小时才有效)(仅适用于5000000),将无法编译该程序。 我一直坚持下去,必须关闭终端窗口。
for i in range( 1, 300000000 ):
check = 1
for j in range( 6, 21 ):
if i % j == 0:
continue
else:
check = 0
break
if check == 1:
print i
break
如果相关,我正在使用Mac OS X Mavericks。
编辑:我曾尝试切换到xrange,但遗憾的是没有区别。
Edit2:我把它留在后台-实际上它只需要14分钟即可运行! 抱歉,我应该首先这样做。
我想您正在使用Python 2。
您的问题是这样的:
range( 1, 300000000 )
您正在建立一个300000000个Python int对象的列表。 如果我们假设Python中的整数是4字节(这是非常错误的),那么您将分配300000000×4 = 1200000000字节= 1 GB。
您应该将其替换为以下内容:
xrange( 1, 300000000 )
xrange的优点是它不会预先预先分配所有Python int。 有关更多信息,请参见xrange文档:
xrange()优于range()的优势是最小的,除非在内存不足的计算机上使用了非常大的范围[...]
使用Python 3时,此问题不再存在,因为range已被删除并且xrange已重命名为range 。
请注意,这将解决您遇到的所有内存错误。 这不会解决使用不良的慢速算法的问题。 在处理数字时,Python并不是真的很快(但是在使用大量数字时,其他语言的执行也会很慢)。
你是什么意思“编译”? 您如何编译Python代码?
尝试使用xrange()
如果这是python 2,那么您确实需要将range
更改为xrange
。 range
通过创建指定大小的列表进行工作,然后逐项迭代。 但是,在这种情况下,您不需要列表本身,仅需要该列表中包含的索引。 因此,您应该首选xrange
因为它是生成器,这意味着它可以迭代而无需在内存中创建列表。 这将使您的程序不必创建一个非常大的列表,而这将占用大量内存。
请注意,在Python 3中, range
具有与Python 2 xrange
相同的行为。
for i in xrange( 1, 300000000 ):
check = 1
for j in xrange( 6, 21 ):
if i % j == 0:
continue
else:
check = 0
break
if check == 1:
print i
break
同样,Python是一种解释型语言,没有像c ++那样的编译步骤。 您所看到的只是运行时间缓慢。
您的Python程序没有错 ,它只是非常非常慢,因为您使用的算法很糟糕。
尝试以下方法:
def gcd(a, b):
while b:
a, b = b, a%b
return a
def lcm(a, b):
return (a // gcd(a, b)) * b
res = 1
for i in range(2, 21):
res = lcm(res, i)
print("Least common multiple of 1..20 is {}".format(res))
编辑:或者,您可以通过意识到19和20是相对质数来使用算法(但使其速度提高约400倍),因此任何解决方案都必须是19 * 20的倍数:
UPTO = 300000000
STEP = 19 * 20
for i in xrange(STEP, UPTO, STEP):
if any(i % div for div in xrange(6, 19)):
continue
else:
print("Solution: {}".format(i))
break
它在我的机器上运行约0.94 s(“好”算法则为0.0000249 s,=再次快了约37,000倍!)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.