关于变量存储

2024-09-29 21:52:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚为欧拉计划的第四个问题写了一个优化的解决方案。在实现算法时,我在设计选择上遇到了一些内部冲突。我不确定是否应该将一个操作的乘积存储在它自己的变量中,以供将来参考,或者不将它存储为变量,并在需要时复制两个操作数的乘积。以下是代码片段:

product = x * y
if (checkPalindrome(product) and product > largest_product):
    largest_product = product

操作数存储在“乘积”中,并在以下行中引用。我好奇的是,这是否被认为是更好的做法相比,复制的产品时,每当一个参考它是必要的。像这样:

if (checkPalindrome(x * y) and x * y > largest_product):
    largest_product = x * y

这种实现上的差异是否会在扩展时产生空间或时间性能上的差异?你知道吗


Tags: and代码算法if产品时间空间差异
3条回答

数字的存储量与其长度成比例(打印出来时)。对于中等大小的数字,比如20位数字,你根本不会注意到这种效果。除非你有大量的数字(几千位数)或者很多数字,否则你不太可能注意到这种效果。你知道吗

两个数的乘法需要。。。好吧,这是一个活跃的研究领域,但是为了这些目的,让我们假设它需要与最长数字(如果长度相似)的长度(打印出来时)的平方成比例的时间。但是,你不太可能注意到这种影响,除非你有大量的数字。你知道吗

正如其他人所观察到的,在Python中乘法不是很快,所以这是一个问题。你知道吗

我建议你写下最清楚的内容,然后在遇到性能问题时解决它们。你知道吗

Python中的算法不是特别快,因此最好避免多次执行相同的计算。顺便说一句,您可以使用内置的max函数,而不是“手工”确定最大乘积。你知道吗

我还应该提到的是,避免使用product = x * y不会节省太多内存。代码仍然需要创建一个int对象来保存x * y的结果,无论如何,将该对象绑定到一个名称不会消耗太多内存。OTOH,执行3次相同的计算不仅浪费时间,还意味着需要创建(并回收)3个对象来存储结果。你知道吗

我建议你看看Other languages have "variables", Python has "names"。要更深入地研究这个重要的话题,请参阅Facts and myths about Python names and values,它是由这么资深的Ned Batchelder写的。你知道吗

实际上,第一种方法是最好的。因为这里是小整数的乘法,所以在后面的方法中影响不大。但是,当你在一个循环中运行这个程序,计算产品的数量时,它也会产生影响。你知道吗

假设你有10个循环。在第二种方法中,如果一次乘法需要0(1)次。因此,在一个循环中,您将有两个这样的计算,因此需要O(2)次。对于10个这样的循环,您将有O(20)次。你知道吗

if (checkPalindrome(x * y) and x * y > largest_product):  # O(1)
    largest_product = x * y       # O(1)
# total O(2) for two calculations

但是,在第一种方法中,由于您只进行了一次计算,并且在以后的步骤中使用了计算值,因此只需要O(1)个时间,仅在计算期间。但是,没有时间了,因为你会参考它进行条件检查。对于10个这样的循环,你将有O(10)次。这样你就节省了50%的时间。你知道吗

product = x * y    # O(1) for one calculation
if (checkPalindrome(product) and product > largest_product):
    largest_product = product

是的,如果内存是一个约束,那么为了存储变量,您可能需要内存。在这种情况下,你可以考虑第二种方法。或者如果只有一个计算点,那么在这种情况下,你最好采用第二种方法。但是,对于第一种情况,内存是约束的,仅仅存储一个变量并不需要大量内存。所以,不管怎样,我发现第一个(计算一次并存储,而不是每次计算)是最好和有效的。你知道吗

相关问题 更多 >

    热门问题