任何更快的选择?

时间:2010-06-10 05:42:58

标签: python performance

cost=0
for i in range(12):
    cost=cost+math.pow(float(float(q[i])-float(w[i])),2)
cost=(math.sqrt(cost))

更快的替代品吗?我需要改进我的整个代码,以便提高每个语句的性能。

感谢你

4 个答案:

答案 0 :(得分:2)

除了已经制作的(和我订阅的)一般优化备注之外, 是一种更“优化”的方式来做你想要的:你操纵值数组并组合他们在数学上。这是非常有用且广泛使用的NumPy package

的工作

您将如何做到这一点:

q_array = numpy.array(q, dtype=float)
w_array = numpy.array(w, dtype=float)
cost = math.sqrt(((q_array-w_array)**2).sum())

(如果您的数组qw已包含浮点数,则可以移除dtype=float。)

这几乎和它可以获得的速度一样快,因为NumPy的操作针对数组进行了优化。它也比循环更易读,因为它既简单又短。

答案 1 :(得分:0)

只是一个提示,但通常会在功能甚至更高级别评估代码时实现真正的性能提升。

在良好的评估过程中,您可能会发现整个代码块被丢弃或重写以简化过程。

答案 2 :(得分:0)

在您清理了狡猾且不易读的代码之后,分析器非常有用。无论是运行一次还是运行数次,你都不应该编写类似的代码。

你为什么要float(q[i])float(w[i])q和`w'的元素是什么类型?

如果x和y是浮点数,那么x - y也将是一个浮点数,因此已经有3次浮点数出现了。

调用math.pow()而不是使用**运算符会带来“math”和“pow”上查找的开销。

Etc等

查看以下代码是否提供相同的答案,并且读取更好且更快:

costsq = 0.0
for i in xrange(12):
    costsq += (q[i] - w[i]) ** 2
cost = math.sqrt(costsq)

在对其进行测试并了解更改原因后,您可以将课程应用于其他Python代码。然后,如果您有更多的数组或矩阵工作要做,请考虑使用numpy

答案 3 :(得分:0)

假设q和w包含数字,则不需要进行浮点数转换,否则您应该更早地将列表转换为可用的表示形式(并与计算分开)

鉴于您的函数似乎仅在执行以下操作:

"nodemon --exec 'yarn build-langs'"

也许这种表格执行得更快。