&引用;对于范围(1,x)内的y;循环运行时间太长。如何在Python中加快这个过程?

&引用;对于范围(1,x)内的y;循环运行时间太长。如何在Python中加快这个过程?,python,Python,此代码以1000的顺序运行需要40秒。我需要在订单=100000000时运行它。有没有办法让我加速这个代码 from fractions import Fraction x=5 order=1000 count=0 while x <=order: for y in range(1,x): if str(Fraction(y/x).limit_denominator()) != "%s/%s"%(y,x): print(Fraction(y

此代码以1000的顺序运行需要40秒。我需要在订单=100000000时运行它。有没有办法让我加速这个代码

from fractions import Fraction

x=5
order=1000
count=0
while x <=order:
    for y in range(1,x):
        if str(Fraction(y/x).limit_denominator()) != "%s/%s"%(y,x):
            print(Fraction(y/x).limit_denominator())
            count += 1
    print(" ")
    x+=1

count= (count + 1) * 6 + (order -1)*6
print(count)
从分数导入分数
x=5
订单=1000
计数=0

而x问题不在于Python;这是您的算法。

int myarray[] = //fill array with values
cout << myarray.length;
int myarray[] = //fill array with values
for(int i = 0; i<n; i++) cout << myarray[i] << " ";
int myarray[] = //fill array with values
for(int i = 0; i<n; i++) {
    for(int j = 0; j<n; j++) {
        cout << myarray[i]+myarray[j] << endl;
//print the sum of every possible pairing of digits in array (with repeats)
要分析运行时的解决方案,首先需要熟悉,通常用Big-O表示法来描述

Big-O表示法描述了当输入的大小发生变化时,运行时是如何变化的(
O(n)

常见的Big-O运行时及其示例如下:

O(1)-运行时不依赖于数组的大小(无论大小都是恒定时间)。

int myarray[] = //fill array with values
cout << myarray.length;
int myarray[] = //fill array with values
for(int i = 0; i<n; i++) cout << myarray[i] << " ";
int myarray[] = //fill array with values
for(int i = 0; i<n; i++) {
    for(int j = 0; j<n; j++) {
        cout << myarray[i]+myarray[j] << endl;
//print the sum of every possible pairing of digits in array (with repeats)
int myarray[]=//用值填充数组

cout正如其他人所提到的,您的算法复杂度很差,但您也使用了
Fraction
错误的算法。使用双参数版本,绝对不要转换和比较字符串。您也在构造和调用
分数(y/x)。无正当理由地限制\u分母()
两次

这将大大加快代码的速度,但无助于算法的复杂性:

order = 1000
x = 5
count = 0
while x <= order:
    for y in range(1, x):
        frac = Fraction(y, x)  # don't use y/x
        if frac.numerator != y:
            # print(frac)  # if you *must* print, reuse this
            count += 1
    # print(" ")
    x += 1

count = (count + 1) * 6 + (order - 1) * 6
print(count)
order=1000
x=5
计数=0

而x可以尝试将结果存储在某种字典中。试着看看你是否可以存储str(分数(y/x)的结果使用唯一键并在每次计算之前先查找该值。如果您只需要最终值,还可以尝试避免打印。project Euler的每个问题都应该通过计算机运行最多60秒来解决。因此我建议您寻找一种更快的方法。谢谢。我的最终代码实际上在该循环中没有打印。那又怎么样你的意思是我应该将代码分成两个进程,其中一个进程被缓存。这不是“对于范围(1,x)中的y:”最长的一步吗,因为它需要在每次1/3-3/3时循环,直到1/100000000-100000000-100000000?你的算法看起来是O(n^2)。我会寻找一个低阶的不同算法。谢谢你的澄清。我对这一点非常陌生,所以我只是尝试制作一个(理论上)有效的代码。实际上,这是一段糟糕的代码,我需要重新编写。非常感谢!我可能需要重新编写这段代码,但您确实让它快了一点。我刚刚再次运行了这段代码。运行这段代码花了40秒,现在只花了一秒钟!您让这段代码快了很多,再次感谢!