Tôi đang cố gắng đánh giá đa thức (mức 3'd) bằng cách sử dụng gọn gàng. Tôi thấy rằng làm điều đó bằng mã python đơn giản sẽ hiệu quả hơn nhiều.tính đa thức tính toán đa thức hiệu quả
import numpy as np
import timeit
m = [3,7,1,2]
f = lambda m,x: m[0]*x**3 + m[1]*x**2 + m[2]*x + m[3]
np_poly = np.poly1d(m)
np_polyval = lambda m,x: np.polyval(m,x)
np_pow = lambda m,x: np.power(x,[3,2,1,0]).dot(m)
print 'result={}, timeit={}'.format(f(m,12),timeit.Timer('f(m,12)', 'from __main__ import f,m').timeit(10000))
result=6206, timeit=0.0036780834198
print 'result={}, timeit={}'.format(np_poly(12),timeit.Timer('np_poly(12)', 'from __main__ import np_poly').timeit(10000))
result=6206, timeit=0.180546045303
print 'result={}, timeit={}'.format(np_polyval(m,12),timeit.Timer('np_polyval(m,12)', 'from __main__ import np_polyval,m').timeit(10000))
result=6206, timeit=0.227771043777
print 'result={}, timeit={}'.format(np_pow(m,12),timeit.Timer('np_pow(m,12)', 'from __main__ import np_pow,m').timeit(10000))
result=6206, timeit=0.168987989426
Tôi có bỏ lỡ điều gì đó không?
Có cách nào khác để đánh giá một đa thức không?
"nó có vẻ lạ implementor quyết định bao gồm một vòng lặp rõ ràng" có lẽ dẫn đến lỗi bộ nhớ nếu bạn cố gắng để làm tất cả trong một khối? – endolith
-1 Nguồn numpy là đánh giá trong hình thức Horner, có thể không được dễ dàng vectorized, nhưng là cao hơn nhiều so với những gì bạn đã viết. (Xem câu trả lời khác cho câu hỏi này.) – Mike