我刚刚为Project Euler的第四个问题编写了一个优化的解决方案。在我实现算法时,我遇到了一些关于设计选择的内部冲突。我不确定是否应该将操作的产品存储在自己的变量中,以备将来参考,或者不将其存储为变量,并在需要时重现两个操作数的乘积。以下是代码片段:
product = x * y
if (checkPalindrome(product) and product > largest_product):
largest_product = product
操作数存储在“product”中,并在以下行中引用。我的好奇心是,与每次提交产品时再现产品相比,这是否被认为是更好的做法。像这样:
if (checkPalindrome(x * y) and x * y > largest_product):
largest_product = x * y
实施中的这种差异是否可以在缩放时产生空间差异或时间性能?
答案 0 :(得分:0)
在实践中,第一种方法是最好的。从这里开始,您将乘以小整数,因此在后面的方法中它不会产生太大的影响。但是,当你在一个循环中运行它来计算产品数量时,它确实会产生影响。
假设您有10个循环。在第二种方法中,如果您的一次乘法需要O(1)时间。因此,在循环中,您将进行2次此类计算,因此需要O(2)次。对于10个这样的循环,你将有O(20)次。
import AVFoundation // this you need for the `AVPlayer`
import AVKit // this is for the `AVPlayerViewController`
let viewController = AVPlayerViewController()
let videoURL = "http://you.videourl.com"
if let player = AVPlayer.playerWithURL(videoURL) as? AVPlayer {
viewController = player
}
但是,在第一种方法中,由于您只进行一次计算,并且在后续步骤中使用计算值,因此仅在计算期间仅花费O(1)时间。但是,没时间,你会引用条件检查。对于10个这样的循环,你将有O(10)次。因此,您节省了50%的时间。
if (checkPalindrome(x * y) and x * y > largest_product): # O(1)
largest_product = x * y # O(1)
# total O(2) for two calculations
是的,如果内存是约束,那么对于存储变量,您可能需要内存。在这种情况下,您可能会想到第二种方法。或者,如果只有一个计算点,那么在这种情况下,您可以选择第二种方法。但是,对于第一种情况,在内存受限的情况下,仅存储变量不会占用大量内存。所以,无论如何,我发现第一个(计算一次并存储而不是每次计算)是最好和最有效的。
答案 1 :(得分:0)
Python中的算术速度并不快,因此最好避免多次执行相同的计算。顺便说一句,而不是手工确定最大产品"你可以使用内置的max
函数来完成它。
我还应该提到,通过避免执行product = x * y
,您无法节省大量RAM。代码仍然需要创建一个int
对象来保存x * y
的结果,将该对象绑定到一个名称并不会占用大量的RAM。 OTOH,执行相同的计算3次不仅浪费时间,这意味着需要创建(并回收)3个对象来存储结果。
我建议你看看Other languages have "variables", Python has "names"。有关这一重要主题的更深入研究,请参阅由资深人士Ned Batchelder撰写的Facts and myths about Python names and values。
答案 2 :(得分:0)
数字需要与其长度成比例的存储量(打印时)。对于适度大小的数字,最多20个数字,您根本不可能注意到这种效果。除此之外,你不太可能注意到效果,除非你有大量数字(数千位数)或很多数字。
两个数字的相乘需要......好吧,这是一个活跃的研究领域,但是出于这些目的,我们说它需要的时间与最长的平方(打印出来的时间)成正比数字(如果长度相似)。但同样,除非你的人数众多,否则你不会注意到这种影响。
正如其他人所观察到的那样,Python中的乘法并不快,所以这是一个问题。
我建议你写一些最清楚的内容,然后在遇到它们时清理你的性能问题。