Tôi đã tìm thấy một phương pháp mà thậm chí còn nhanh hơn DSM, lấy cảm hứng từ Eric, mặc dù sự cải thiện được nhìn thấy rõ nhất với các danh sách giá trị nhỏ hơn; ở các giá trị rất lớn, chi phí của việc lặp lại chính nó bắt đầu lớn hơn lợi thế của việc thực hiện kiểm tra sự thật trong quá trình tạo mảng numpy thay vì sau. Thử nghiệm với cả hai is
và ==
(đối với các tình huống trong đó các chuỗi được tập trung so với khi chúng có thể không được, vì is
sẽ không hoạt động với các chuỗi không phải là nội bộ.) cho thấy rằng trong khi phiên bản của tôi với ==
chậm hơn so với is
, nó vẫn nhanh hơn nhiều so với phiên bản DSM.
thử nghiệm thiết lập:
import timeit
def timer(statement, count):
return timeit.repeat(statement, "from random import choice;import numpy as np;x = [choice(['True', 'False']) for i in range(%i)]" % count)
>>> stateIs = "y = np.fromiter((e is 'True' for e in x), bool)"
>>> stateEq = "y = np.fromiter((e == 'True' for e in x), bool)"
>>> stateDSM = "y = np.array(x) == 'True'"
Với 1.000 mặt hàng, báo cáo nhanh mất khoảng 66% thời gian của DSM:
>>> timer(stateIs, 1000)
[101.77722641656146, 100.74985342340369, 101.47228618107965]
>>> timer(stateEq, 1000)
[112.26464996250706, 112.50754567379681, 112.76057346127709]
>>> timer(stateDSM, 1000)
[155.67689949529995, 155.96820504501557, 158.32394669279802]
Đối với mảng chuỗi nhỏ hơn (trong hàng trăm chứ không phải hàng ngàn), thời gian trôi qua nhỏ hơn 50% của DSM:
>>> timer(stateIs, 100)
[11.947757485669172, 11.927990253608186, 12.057855628259858]
>>> timer(stateEq, 100)
[13.064947253943501, 13.161545451986967, 13.30599035623618]
>>> timer(stateDSM, 100)
[31.270060799078237, 30.941749748808434, 31.253922641324607]
Một chút hơn 25% DSM khi hoàn tất với 50 mặt hàng theo danh sách:
>>> timer(stateIs, 50)
[6.856538342483873, 6.741083326021908, 6.708402786859551]
>>> timer(stateEq, 50)
[7.346079345032194, 7.312723444475523, 7.309259899921017]
>>> timer(stateDSM, 50)
[24.154247576229864, 24.173593700599667, 23.946403452288905]
Đối với 5 mặt hàng, khoảng 11% của DSM:
>>> timer(stateIs, 5)
[1.8826215278058953, 1.850232652068371, 1.8559381315990322]
>>> timer(stateEq, 5)
[1.9252821868467436, 1.894011299061276, 1.894306935199893]
>>> timer(stateDSM, 5)
[18.060974208809057, 17.916322392367874, 17.8379771602049]
Có một chuỗi mảng NumPy (nếu một điều như vậy tồn tại) hoặc một mảng chuỗi python? – Eric
Đó là một mảng chuỗi dày đặc - kỳ lạ, tôi biết. – Newmu
@Newmu - Tôi nghĩ rằng giải pháp cho điều này là để tránh nhận được một loạt các biểu diễn chuỗi ở nơi đầu tiên. Làm thế nào bạn đến bằng mảng đó? Có lẽ đó là nơi chúng ta nên bắt đầu tìm cách để tối ưu hóa điều này ... – mgilson