V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jzq526
V2EX  ›  Python

Python 2 里面的 xrange 为什么会出现 OverflowError?

  •  
  •   jzq526 · 2019-09-26 10:17:02 +08:00 · 2498 次点击
    这是一个创建于 1054 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在网上看到一个数学题,整数 33 能否用三个整数的立方和表示。正好刚开始学 Python,就写了个小程序:

    import sys
    max=sys.maxint
    min=-sys.maxint-1
    for x in xrange(min,max):
        for y in xrange(min,max):
            for z in xrange(min,max):
                if x**3+y**3+z**3==33:
                    print "x=",x
                    print "y=",y
                    print "z=",z
    

    简单粗暴,就是不停地尝试。 但在运行时,提示:OverflowError: xrange() result has too many items 按照书上的说法,xrange 每次循环只会产生一个对象,应该不会这样。range 每次都是先生成所有的数据,所以容易出现这个问题,而且性能也不好。 以上是 python2 程序。

    (因为书上提到 python3 中的 range 和 python2 中的 xrange 相同,所以把程序换成了 python3,现在正在运行)

    第 1 条附言  ·  2019-09-26 11:34:57 +08:00
    这个程序基本上就是靠 CPU 和时间堆出来的。
    不过这不是重点,重点是 xrang 为什么报错
    谢谢 @gjquoiai 朋友,给出了一个解释,python2 的 xrang 和 rang 都受限于 C 语言的长整型的表示能力。
    8 条回复    2019-09-26 11:36:37 +08:00
    robinlovemaggie
        1
    robinlovemaggie  
       2019-09-26 10:42:32 +08:00
    求立方和有必要遍历负值域吗?
    Raven316
        2
    Raven316  
       2019-09-26 10:49:41 +08:00   ❤️ 1
    @robinlovemaggie #1 有吧,不过这也太暴力了。。
    gjquoiai
        3
    gjquoiai  
       2019-09-26 11:05:46 +08:00
    Vegetable
        4
    Vegetable  
       2019-09-26 11:26:06 +08:00
    还 33 呢?人家 42 都算完了...
    不要这么尝试了,这能算出来,超算面子往哪搁
    jzq526
        5
    jzq526  
    OP
       2019-09-26 11:29:04 +08:00   ❤️ 1
    @Raven316 @robinlovemaggie 这个题目很古老,是个猜想。反正也没有什么更好的办法,只能枚举。而且已经有人枚举出来了,答案是:( 8866128975287528 )^3+(–8778405442862239 )^3+(–273611468807040 )^3=33。据说他们正在找能得出 42 的组合。
    都是玩的,好像也没有什么真正的价值
    jzq526
        6
    jzq526  
    OP
       2019-09-26 11:30:00 +08:00
    @Vegetable 42 算出来了?我在搜搜。有个数学家说自己用了笔记本花了好几天时间才找到的
    jzq526
        7
    jzq526  
    OP
       2019-09-26 11:30:54 +08:00
    @Vegetable (-80538738812075974)^3 + 80435758145817515^3 + 12602123297335631^3=42
    Raven316
        8
    Raven316  
       2019-09-26 11:36:37 +08:00
    @jzq526 #7 只能说 666
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4270 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 01:45 · PVG 09:45 · LAX 18:45 · JFK 21:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.