据我所知,该range()函数实际上是Python 3中的一个对象类型,它可以动态生成其内容,类似于生成器.
在这种情况下,我预计下面的行会花费大量的时间,因为为了确定1千万亿是否在该范围内,必须生成一个千万亿的值:
1000000000000000 in range(1000000000000001)
Run Code Online (Sandbox Code Playgroud)
此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的).
我也试过这样的事情,但计算仍然几乎是即时的:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Run Code Online (Sandbox Code Playgroud)
如果我尝试实现自己的范围功能,结果就不那么好了!!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Run Code Online (Sandbox Code Playgroud)
range()在引擎盖下做的对象是什么让它如此之快?
选择Martijn Pieters的答案是因为它的完整性,但也看到了abarnert的第一个答案,可以很好地讨论在Python 3中range成为一个完整的序列意味着什么,以及关于__contains__Python实现中函数优化的潜在不一致的一些信息/警告.abarnert的另一个答案更详细,并为那些对Python 3中的优化背后的历史感兴趣的人提供了链接(并且缺乏xrangePython 2中的优化).poke和wim的答案为感兴趣的人提供了相关的C源代码和解释.
我将一个整数添加到包含 1000 个元素的整数数组中。当我第一次将单个整数转换为numpy.int64python-native时,速度提高了 25% int。
为什么?作为一般经验法则,我是否应该将单个数字转换为本机 python 格式,以便对大约此大小的数组进行单个数字到数组的操作?
\n注意:可能与我之前的问题Conjugating a complex number much fast if number has python-native complex type 有关。
\nimport numpy as np\n\nnnu = 10418\nnnu_use = 5210\na = np.random.randint(nnu,size=1000)\nb = np.random.randint(nnu_use,size=1)[0]\n\n%timeit a + b # --> 3.9 \xc2\xb5s \xc2\xb1 19.9 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n%timeit a + int(b) # --> 2.87 \xc2\xb5s \xc2\xb1 8.07 ns per loop (mean \xc2\xb1 std. dev. of …Run Code Online (Sandbox Code Playgroud) 我正在将以下 python 计算的结果与 Mathematica 进行比较:https://www.wolframalpha.com/input ?i=sum+%28500+choose+r+%29%28-1%29%5Er+%2F%28r%21 %29+%2C+r%3D0+至+500
import numpy as np
from decimal import *
import scipy.special
from scipy.special import factorial
getcontext().prec = 30
i = 500
sum(np.array([scipy.special.comb(Decimal(i), (r), exact=True)*pow(-1, r)/Decimal(factorial(r, exact=False)) for r in range(i+1)]))
Run Code Online (Sandbox Code Playgroud)
尽管我通过模块在 python 代码中设置了任意精度,但这两个计算都给出了几乎相同的值,i = 400但之后未能收敛decimal。用 Mathematica 计算似乎是正确的。我想知道,对于更大的数据,我们怎样才能在 python 中得到与 Mathematica 相同的结果呢i?
python precision wolfram-mathematica numpy binomial-coefficients