在我的领域中,将一些数字对齐,一起操作它们并取结果的平方根是很常见的.例如,这在毕达哥拉斯定理和RMS计算中完成.
在numpy中,我做了以下事情:
result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))
Run Code Online (Sandbox Code Playgroud)
在纯python中会出现这样的情况:
result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.
Run Code Online (Sandbox Code Playgroud)
但是,我一直在使用这种纯Python形式,因为我发现它更紧凑,独立于导入,看似相同:
result = (A**2 + B**2)**0.5 # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5
Run Code Online (Sandbox Code Playgroud)
我听说有些人认为**运算符是一种黑客攻击,并且通过对它进行取幂来对数字进行求数0.5是不可读的.但我想问的是:
"有没有任何计算理由更喜欢前两种替代品而不是第三种替代品?"
谢谢阅读!
我需要计算一些数字的平方根,例如\xe2\x88\x9a9 = 3和\xe2\x88\x9a2 = 1.4142。我怎样才能用Python做到这一点?
输入可能都是正整数,并且相对较小(比如小于十亿),但万一它们不是,有什么可能会破坏吗?
\n注意:这是在 Meta 上讨论现有同标题问题后对规范问题的尝试。
\n有关的
\n我简直不敢相信我刚刚测量的结果:
python3 -m timeit -s "from math import sqrt" "sqrt(2)"
5000000 loops, best of 5: 42.8 nsec per loop
python3 -m timeit "2 ** 0.5"
50000000 loops, best of 5: 4.93 nsec per loop
Run Code Online (Sandbox Code Playgroud)
这违背了任何直觉……它应该正好相反!
macOS Catalina 上的 Python 3.8.3
我最近发现x**.5并且math.sqrt(x)并不总是在Python中产生相同的结果:
Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)]
on win32
>>> 8885558**.5 - math.sqrt(8885558)
-4.5474735088646412e-13
Run Code Online (Sandbox Code Playgroud)
检查低于10**7的所有整数,这两种方法对几乎正好0.1%的样本产生不同的结果,对于较大的数字,误差的大小增加(缓慢).
所以问题是,哪种方法更准确?
我想在不使用数学模块的情况下找到数字的平方根,因为我需要调用该函数大约20k次并且不想通过在每次调用函数时链接到数学模块来减慢执行速度
有没有更快更容易找到平方根的方法?
我在Python33/Lib中找到了所有其他模块,但我找不到这些.我确信还有其他人"失踪",但这些是我注意到的唯一.我导入它们时工作得很好,我找不到它们.我检查了sys.path,他们不在那里的任何地方.它们是内置的还是什么?
我的Python程序太慢了.因此,我对其进行了分析,发现大部分时间都花在计算两点之间距离的函数上(一个点是3个Python浮点数的列表):
def get_dist(pt0, pt1):
val = 0
for i in range(3):
val += (pt0[i] - pt1[i]) ** 2
val = math.sqrt(val)
return val
Run Code Online (Sandbox Code Playgroud)
为了分析为什么这个函数这么慢,我编写了两个测试程序:一个用Python编写,一个用C++编写类似的计算.他们计算了100万对点之间的距离.(Python和C++中的测试代码如下.)
Python计算需要2秒,而C++需要0.02秒.100倍的差异!
为什么Python代码比C++代码这么简单的数学计算要慢得多?如何加快速度以匹配C++性能?
用于测试的Python代码:
import math, random, time
num = 1000000
# Generate random points and numbers
pt_list = []
rand_list = []
for i in range(num):
pt = []
for j in range(3):
pt.append(random.random())
pt_list.append(pt)
rand_list.append(random.randint(0, num - 1))
# Compute
beg_time = time.clock()
dist = …Run Code Online (Sandbox Code Playgroud) 我知道我可以使用找到表达式的平方根math.sqrt(x).
我也知道我可以找到平方根x**0.5.
但两个为什么呢?这不是非pythonic吗?有什么用的math.sqrt()时候,我们可以直接将其提升到0.5次方?