相关疑难解决方法(0)

为什么Python 3中的"1000000000000000在范围内(1000000000000001)"如此之快?

据我所知,该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源代码和解释.

python performance range python-3.x python-internals

1890
推荐指数
11
解决办法
18万
查看次数

如果单个整数具有 python 原生 int 类型,则将单个整数添加到 numpy 数组会更快

我将一个整数添加到包含 1000 个元素的整数数组中。当我第一次将单个整数转换为numpy.int64python-native时,速度提高了 25% int。

\n

为什么?作为一般经验法则,我是否应该将单个数字转换为本机 python 格式,以便对大约此大小的数组进行单个数字到数组的操作?

\n

注意:可能与我之前的问题Conjugating a complex number much fast if number has python-native complex type 有关。

\n
import 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 arrays integer numpy

7
推荐指数
1
解决办法
300
查看次数

如何更精确地进行二项式系数和阶乘计算?

我正在将以下 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

1
推荐指数
1
解决办法
343
查看次数