【问题标题】:python, square finder, memory errorpython,正方形查找器,内存错误
【发布时间】:2015-08-11 14:31:35
【问题描述】:

我一直在研究一个问题,以确定给定整数 n 是否是完美正方形。虽然算法有效,但我得到了MemoryError。我应该如何改写这段代码?

提前致谢。

def is_square(n):    
    for i in range(1, (n/2)):
        i += 1
        if n % i == 0 and n // i == i:
            return True
    return False

【问题讨论】:

  • 首先,如果这是python2,请尝试将range更改为xrange。前者将生成 1 到 n/2 之间的所有整数的列表,并将它们全部保存在内存中。
  • 如果没有导致它的输入,就无法判断出了什么问题。仅供参考,您只需要检查while i * i <= n 'i' 从 1 开始的位置。顺便说一句,为什么在 for 语句中将 i 增加 1?
  • 感谢@eric-appelt,xrange 成功了!
  • @marcadian,我将 i 增加了 1,以便它从 1 而不是 0 开始。
  • 为什么不让您的range 从 2 开始?这是第一个值得检查的因素。这样你就不需要在开始或循环时使用奇怪的i += 1

标签: python memory-management perfect-square


【解决方案1】:

几件事:

  1. 这似乎是 Python2 代码(因为 range(1, n/2) 会在 Python3 中为所有奇怪的 ns 抛出 TypeError)。正如 Eric Appelt 在 cmets 中建议的那样,您应该使用 xrange 而不是 range。 Python2 中的range 会在您真正需要生成器时创建一个列表。

  2. 您可以通过检查i * i == n(或i**2 == n)来减少正在执行的操作的数量。然后,您将进行一次乘法(或指数)和一次相等检查,而不是一个 mod、一个 floordiv 和两次相等检查。

  3. 如果你要走那么远,为什么不直接做def is_square(n): root = n**0.5; return int(root) == root?你会发现很多“改进算法”都是利用数学而不是蛮力。

无关,没有理由在 for 循环内执行 i += 1。这就是 for 循环的作用。

【讨论】:

  • 谢谢亚当。测试直接值比测试这么多数字要快得多(毕竟,我不是在寻找因素,只是在寻找平方)!此外,您完全同意#2。聪明,聪明!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多