开发者

any faster alternative?

开发者 https://www.devze.com 2023-01-03 10:52 出处:网络
cost=0 for i in range(12): cost=cost+math.pow(float(float(q[i])-float(w[i])),2) cost=(math.sqrt(cost)) Any faster alternative to this? i am need to improve my ent开发者_运维百科ire code so trying to
cost=0
for i in range(12):
    cost=cost+math.pow(float(float(q[i])-float(w[i])),2)
cost=(math.sqrt(cost))

Any faster alternative to this? i am need to improve my ent开发者_运维百科ire code so trying to improve each statements performance.

thanking u


In addition to the general optimization remarks that are already made (and to which I subscribe), there is a more "optimized" way of doing what you want: you manipulate arrays of values and combine them mathematically. This is a job for the very useful and widely used NumPy package!

Here is how you would do it:

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

(If your arrays q and w already contain floats, you can remove the dtype=float.)

This is almost as fast as it can get, since NumPy's operations are optimized for arrays. It is also much more legible than a loop, because it is both simple and short.


Just a hint, but usually real performance improvements come when you evaluate the code at a function or even higher level.

During a good evaluation, you may find whole blocks that code be thrown away or rewritten to simplify the process.


Profilers are useful AFTER you've cleaned up crufty not-very-legible code. irrespective of whether it's to be run once or N zillion times, you should not write code like that.

Why are you doing float(q[i]) and float(w[i])? What type(s) is/are the elements of q and `w'?

If x and y are floats, then x - y will be a float too, so that's 3 apparently redundant occurrences of float() already.

Calling math.pow() instead of using the ** operator bears the overhead of lookups on 'math' and 'pow'.

Etc etc

See if the following code gives the same answers and reads better and is faster:

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

After you've tested that and understood why the changes were made, you can apply the lessons to other Python code. Then if you have a lot more array or matrix work to do, consider using numpy.


Assuming q and w contain numbers the conversions to float are not necessary, otherwise you should convert the lists to a usable representation earlier (and separately from your calculation)

Given that your function seems to only be doing the equivalent of this:

cost = sum( (qi-wi)**2 for qi,wi in zip(q[:12],w) ) ** 0.5

Perhaps this form would execute faster.

0

精彩评论

暂无评论...
验证码 换一张
取 消