मैं iteratively विरल मैट्रिक्स का निर्माण करना चाहते, और पाया है कि इस SciPy प्रलेखन के अनुसार के लिए दो उपयुक्त विकल्प हैं कि:dilts के सामान्य निर्देश की तुलना में lil_matrix और dok_matrix इतनी धीमी क्यों हैं?
वर्ग scipy.sparse.lil_matrix (ARG1, आकार = कोई नहीं , dtype = कोई नहीं, प्रतिलिपि = झूठी) [स्रोत] पंक्ति आधारित लिंक्ड सूची विरल मैट्रिक्स
यह विरल मैट्रिक्स संवर्द्धित के निर्माण के लिए एक कुशल संरचना है।
वर्ग scipy.sparse.dok_matrix (ARG1, आकार = कोई नहीं, dtype = कोई नहीं, प्रतिलिपि = झूठी) [स्रोत] चाबियों का शब्दकोश आधारित विरल मैट्रिक्स।
यह स्पैर मैट्रिस वृद्धिशील बनाने के लिए एक कुशल संरचना है।
लेकिन जब मैं मान (जो बाद में आसानी से विरल मैट्रिक्स के लिए परिवर्तित किया जा सकता है) के शब्दकोश का एक शब्दकोश के निर्माण के लिए की तुलना बेंचमार्क चल रहा हूँ, बाद पता चला है के किसी भी उपयोग करने की तुलना के बारे में 10-20 गुना तेजी से होने के लिए विरल मैट्रिक्स मॉडल:
from scipy.sparse import dok_matrix, lil_matrix
from timeit import timeit
from collections import defaultdict
def common_dict(rows, cols):
freqs = defaultdict(lambda: defaultdict(int))
for row, col in zip(rows, cols):
freqs[row][col] += 1
return freqs
def dok(rows, cols):
freqs = dok_matrix((1000,1000))
for row, col in zip(rows, cols):
freqs[row,col] += 1
return freqs
def lil(rows, cols):
freqs = lil_matrix((1000,1000))
for row, col in zip(rows, cols):
freqs[row,col] += 1
return freqs
def benchmark():
cols = range(1000)
rows = range(1000)
res = timeit("common_dict({},{})".format(rows, cols),
"from __main__ import common_dict",
number=100)
print("common_dict: {}".format(res))
res = timeit("dok({},{})".format(rows, cols),
"from __main__ import dok",
number=100)
print("dok: {}".format(res))
res = timeit("lil({},{})".format(rows, cols),
"from __main__ import lil",
number=100)
print("lil: {}".format(res))
परिणाम:
benchmark()
common_dict: 0.11778324202168733
dok: 2.2927695910912007
lil: 1.3541790939634666
यह क्या है कि मैट्रिक्स मॉडल के लिए इस तरह के एक भूमि के ऊपर का कारण बनता है, और वहाँ यह गति अप करने के लिए किसी तरह है? क्या ऐसे मामलों का उपयोग किया जाता है जहां डॉक या लिल को डिक्ट्स के एक सामान्य निर्देश पर प्राथमिकता दी जाती है?
मेरे सिस्टम पर, 'fast_dok'' common_dict' से लगभग चार गुना धीमा है और 'tuple_dict' से आठ गुना धीमा है, जिसे मैंने आपका पहला उदाहरण कहा है। –
Cont .: मुझे यकीन नहीं है, क्यों: ऐसा इसलिए हो सकता है क्योंकि आप प्रत्येक जोड़ी के लिए 'dict 'बनाते हैं, या शायद' dok_matrix' लिखने के समय 'get()' को ओवरराइड नहीं किया गया था, और अब यह करता है? सौभाग्य से, 'अपडेट() 'अभी तक ओवरराइड नहीं है, इसलिए पहला समाधान काम करता है और यह बहुत तेज़ है। एक चेतावनी: 'डिफॉल्टडिक्ट' में कोई भी '0 'परिणामी' dok_matrix' द्वारा भी संग्रहीत किया जाएगा; सौभाग्य से, कोई डेटा को रूपांतरित कर सकता है उदा। 'csr_matrix' और फिर 'elim_zeros()' को कॉल करें। –
Py3.6 में नया 'dict' कोड (डिफ़ॉल्ट आदेश दिया गया आदि) है, इसलिए गति में परिवर्तन हो सकते हैं। – hpaulj