ประสิทธิภาพของการดำเนินการของอาร์เรย์ Python / Numpy มีขนาดเพิ่มขึ้นอย่างไร


21

Python / Numpy arrays ปรับขนาดอย่างไรเมื่อเพิ่มขนาดอาเรย์

สิ่งนี้ขึ้นอยู่กับพฤติกรรมบางอย่างที่ฉันสังเกตเห็นในขณะทำการเปรียบเทียบรหัส Python สำหรับคำถามนี้: วิธีแสดงนิพจน์ที่ซับซ้อนนี้โดยใช้ชิ้นส่วนที่เป็นก้อน

ปัญหาส่วนใหญ่เกี่ยวข้องกับการทำดัชนีเพื่อเติมอาเรย์ ฉันพบว่าข้อดีของการใช้ Cython และ Numpy (ไม่ดีมาก) กับ Python loop แตกต่างกันไปขึ้นอยู่กับขนาดของอาร์เรย์ที่เกี่ยวข้อง ทั้ง Numpy และ Cython มีความได้เปรียบด้านประสิทธิภาพที่เพิ่มขึ้นจนถึงจุดหนึ่ง (บางแห่งมีขนาดประมาณสำหรับ Cython และN = 2000สำหรับ Numpy บนแล็ปท็อปของฉัน) หลังจากนั้นข้อดีของมันก็ลดลง (ฟังก์ชัน Cython ยังคงเร็วที่สุด)N=500N=2000

ฮาร์ดแวร์นี้ถูกกำหนดหรือไม่? ในแง่ของการทำงานกับอาร์เรย์ขนาดใหญ่แนวทางปฏิบัติที่ดีที่สุดที่ควรปฏิบัติตามสำหรับรหัสที่ประสิทธิภาพนั้นได้รับการชื่นชมคืออะไร

พล็อตของเวลาดำเนินการที่สัมพันธ์กับโค้ดลูปสำหรับการใช้งาน vectorized และ Cython

คำถามนี้ ( เพราะเหตุใดการปรับขนาดการคูณเมทริกซ์ - เวกเตอร์ของฉันไม่ได้ ) อาจเกี่ยวข้องกัน แต่ฉันสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการที่แตกต่างกันของวิธีการรักษาอาร์เรย์ในระดับไพ ธ อนเมื่อเทียบกัน


คุณลองnumexprหรือยัง ตัวอย่างเช่นนอกจากนี้การพูดคุยนี้ที่ชี้ไปที่bloscและCArrayทั้งหมดนั้นหมายถึงการเพิ่มความเร็วให้มากขึ้น (และอาจข้ามข้อ จำกัด แบนด์วิดท์หน่วยความจำ)
0 0

1
คุณช่วยโพสต์รหัสที่ใช้โพรไฟล์ได้ไหม อาจมีบางสิ่งเกิดขึ้นที่นี่
meawoppl

คำตอบ:


5

416kB

def timeit(size):
     t0 = time.time()
     for _ in xrange(10):
         np.random.random(size)
     return time.time() - t0

sizes = np.logspace(1, 6, 40)
times = [timeit(s) for s in sizes]

มีบางสิ่งผิดปกติกับเกณฑ์มาตรฐานนี้สำหรับการเริ่มต้นฉันไม่ได้ปิดการใช้งานการรวบรวมขยะและฉันกำลังทำเงินรวมไม่ใช่เวลาที่ดีที่สุด แต่อดทนกับฉัน

800064kB

หนึ่งควรกังวลเกี่ยวกับขนาดแคช? ตามกฎทั่วไปฉันบอกว่าไม่ การปรับให้เหมาะสมใน Python หมายถึงการทำให้โค้ดมีความซับซ้อนมากขึ้นเพื่อเพิ่มประสิทธิภาพที่น่าสงสัย อย่าลืมว่าออบเจ็กต์ Python เพิ่มโอเวอร์เฮดจำนวนมากที่ยากต่อการติดตามและทำนาย ฉันสามารถนึกถึงสองกรณีที่นี่เป็นปัจจัยที่เกี่ยวข้อง:

  • การดำเนินงานขั้นพื้นฐานในอาร์เรย์ขนาดใหญ่ (เช่นประเมินพหุนาม) จำกัด ด้วยแบนด์วิดธ์หน่วยความจำ ใช้Numexprหรือ (หากข้อมูลที่มีขนาดใหญ่มาก) Pytables พวกเขาได้รับการปรับให้เหมาะสมเพื่อคำนึงถึงขนาดแคชในบัญชีท่ามกลางการเพิ่มประสิทธิภาพอื่น ๆ
  • รหัสประสิทธิภาพที่สำคัญ: หากคุณต้องการบีบอัดทุกไมโครวินาทีคุณไม่ควรใช้ Python ตั้งแต่แรก การเขียน vectorized Cythonและออกจากคอมไพเลอร์ทำในสิ่งที่ดีที่สุดน่าจะเป็นวิธีที่ไม่เจ็บปวด

ในความคิดเห็น Evert กล่าวถึง CArray โปรดทราบว่าแม้จะใช้งานได้การพัฒนาก็หยุดลงและถูกทอดทิ้งเป็นโครงการแบบสแตนด์อโลน ฟังก์ชั่นจะรวมอยู่ในBlazeแทนซึ่งเป็นโครงการต่อเนื่องที่จะสร้าง "Numpy รุ่นใหม่"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.