अधिकांश Numpy का फ़ंक्शन डिफ़ॉल्ट रूप से मल्टीथ्रेडिंग को सक्षम करेगा।
उदाहरण के लिए, मैं एक 8-कोर इंटेल सीपीयू वर्कस्टेशन पर काम करता हूं, अगर मैं एक स्क्रिप्ट चलाता हूं
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
लिनक्स topचलने के दौरान 800% सीपीयू उपयोग दिखाएगा,
जिसका अर्थ है कि सुन्न स्वचालित रूप से पता लगाता है कि मेरे कार्य केंद्र में 8 कोर हैं, और np.sqrtगणना में तेजी लाने के लिए स्वचालित रूप से सभी 8 कोर का उपयोग करें।
हालांकि, मुझे एक अजीब बग मिला। अगर मैं कोई स्क्रिप्ट चलाता हूं
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
सीपीयू का उपयोग 100% है !!।
इसका मतलब यह है कि यदि आप किसी भी प्रकार्य समारोह को चलाने से पहले दो पांडा डेटाफ्रेम को जोड़ते हैं, तो बिना किसी चेतावनी के ऑटो मल्टीथ्रेडिंग फीचर बिना किसी चेतावनी के चला जाता है! यह बिल्कुल उचित नहीं है, क्यों पांडस डेटाफ्रेम गणना नम्पी थ्रेडिंग सेटिंग को प्रभावित करेगा? यह एक बग है? इसके आसपास कैसे काम करें?
पुनश्च:
मैं लिनक्स perfउपकरण का उपयोग करके आगे खुदाई करता हूं ।
पहला स्क्रिप्ट शो चल रहा है
जबकि दूसरा स्क्रिप्ट शो चल रहा है
तो दोनों लिपि शामिल है libmkl_vml_avx2.so, जबकि पहली लिपि में अतिरिक्त शामिल है libiomp5.soजो ओपनएमपी से संबंधित है।
और चूंकि vml का अर्थ है इंटेल वेक्टर गणित पुस्तकालय, इसलिए vml doc के अनुसार मुझे लगता है कि कम से कम कार्य नीचे सभी स्वचालित रूप से गुणा किए गए हैं
import numpy as np import pandas as pd import os os.environ["MKL_NUM_THREADS"] = '4' print(os.environ["MKL_NUM_THREADS"]) df=pd.DataFrame(np.random.random((10,10))) df+df print(os.environ["MKL_NUM_THREADS"]) a = np.random.random((20000000, 3)) b = np.random.random((3, 30)) for _ in range(10): c = np.dot(a, b)


