繁体   English   中英

编译时Python卡住

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM