草庐IT

python - 为什么 IDLE 3.4 在这个程序上花费这么长时间?

coder 2023-08-19 原文

编辑:我正在完全重做这个问题。问题与time.time()无关

这是一个程序:

import time
start=time.time()
a=9<<(1<<26)             # The line that makes it take a while
print(time.time()-start)

此程序保存为文件并在 Python 3.4 中以 IDLE 运行时,需要大约 10 秒,即使从 time.time() 打印出 0.0。 IDLE 的问题非常明显,因为从命令行运行时,该程序几乎不需要任何时间。

senshin 发现的另一个具有相同效果的程序是:

def f(): 
    a = 9<<(1<<26)

我已经确认,同一个程序在 Python 2.7 IDLE 中或从 Python 2.7 或 3.4 的命令行运行时,几乎是瞬时的。

那么 Python 3.4 IDLE 做了什么让它花费这么长时间?我知道计算这个数字并将其保存到内存是磁盘密集型的,但我想知道为什么 Python 3.4 IDLE 执行此计算并在 Python 2.7 IDLE 和命令行 Python 可能不执行时写入。

最佳答案

我会查看那条线并将其拆开。你有:

9 << (1 << 26)

(1 << 26)是第一个计算的表达式,它产生一个非常大的数字。这行的意思是,您要将数字 1 乘以 2 的 26 次方,有效地产生数字 2 ** 26。在内存中。然而,这不是问题。然后将 9 左移 2 ** 26。这会产生一个在内存中长约 5000 万位的数字(我什至无法准确计算它!),因为左移太大了。以后要小心,因为看似少量的转移实际上增长得非常快。如果它再大一点,你的程序可能根本就没有运行。您的表达式在数学上计算为 9 * 2 ** (2 ** 26) ,如果你好奇的话。

评论部分的歧义可能实际上是在处理 python 在后台如何处理这一巨大内存部分,而不是 IDLE。

编辑 1:

我认为正在发生的事情是,即使将数学表达式置于尚未调用的函数中,仅当表达式是自给自足的时,数学表达式的计算结果也是如此。这意味着如果在等式中使用变量,则等式将在字节代码中保持不变,并且在硬执行之前不会计算。该函数必须被解释,在那个过程中,我认为你的值实际上是计算出来的,导致时间变慢。我不确定这一点,但我强烈怀疑这种行为是根本原因。即使不是这样,你也必须承认 9<<(1<<26)将计算机踢到后面,在那里可以做的优化不多。

In[73]: def create_number():
            return 9<<(1<<26)
In[74]: #Note that this seems instantaneous, but try calling the function!
In[75]: %timeit create_number()
#Python environment crashes because task is too hard

然而,这种测试存在轻微的欺骗性。当用常规时间尝试这个时,我得到:

In[3]: from timeit import timeit
In[4]: timeit(setup = 'from __main__ import create_number', stmt = 'create_number()', number = 1)
Out[4]: .004942887388800443

还要记住,打印值是不可行的,所以像这样:

In[102]: 9<<(1<<26)

甚至不应该尝试。

要获得更多支持:

我觉得自己像个叛逆者,所以我决定看看如果我对等式的原始执行计时会发生什么:

In[107]: %timeit 9<<(1<<26)
10000000 loops, best of 3: 22.8 ns per loop

In[108]: def empty(): pass
In[109]: %timeit empty()
10000000 loops, best of 3: 96.3 ns per loop

这真的很可疑,因为显然这种计算发生的速度比 Python 调用空函数所花费的时间要快,而事实显然不是这样。我再说一遍,这不是即时的,但可能与检索内存中某处已计算的对象有关,并重新使用该值来计算表达式。不管怎样,问得好。

关于python - 为什么 IDLE 3.4 在这个程序上花费这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24217053/

有关python - 为什么 IDLE 3.4 在这个程序上花费这么长时间?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  9. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  10. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

随机推荐