मैं एक विधि भी तेजी से है कि मिल गया है डीएसएम, एरिक से प्रेरणा ले रहा है, हालांकि सुधार मूल्यों की छोटी सूचियों के साथ सबसे अच्छा देखा जाता है; बहुत बड़े मूल्यों पर, पुनरावृत्ति की लागत स्वयं के बजाए numpy सरणी के निर्माण के दौरान सच्चाई परीक्षण करने के लाभ से अधिक हो जाती है। is
और ==
दोनों के साथ परीक्षण (ऐसी परिस्थितियों के लिए जहां स्ट्रिंग्स बनाम इंटर्न बनाम हो, जब वे is
गैर-इंटर्न वाले तारों के साथ काम नहीं करेंगे। 'True'
शायद स्क्रिप्ट में एक शाब्दिक होने जा रहा है, हालांकि इसे प्रशिक्षित किया जाना चाहिए) ने दिखाया कि ==
के साथ मेरा संस्करण is
के मुकाबले धीमा था, यह अभी भी डीएसएम के संस्करण से बहुत तेज था।
स्थापना परीक्षण:, (बल्कि हजारों की तुलना में सैकड़ों में)
>>> 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]
छोटे स्ट्रिंग सरणियों के लिए:
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'"
1000 आइटम के साथ
, तेजी से बयान 66% डीएसएम के समय लेने के लिए बीएसएम के 50% से कम समय:
>>> 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]
डीएसएम के 25% से थोड़ा अधिक होने पर सूची के अनुसार 50 आइटम के साथ:
>>> 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]
5 आइटम, डीएसएम के बारे में 11% के लिए:
>>> 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]
यह एक numpy स्ट्रिंग सरणी है (अगर ऐसी बात मौजूद है) या एक अजगर स्ट्रिंग सरणी? – Eric
यह एक numpy स्ट्रिंग सरणी है - अजीब, मुझे पता है। – Newmu
@ न्यूमू - मुझे लगता है कि इसका समाधान पहली जगह स्ट्रिंग प्रस्तुतियों की सरणी प्राप्त करने से बचने के लिए है। आप उस सरणी से कैसे आए? शायद यही वह जगह है जहां हमें इसे अनुकूलित करने के लिए देखना शुरू कर देना चाहिए ... – mgilson