วิธีเพิ่มการใช้งาน CPU ของ Python


21

ฉันใช้ Python เพื่อดำเนินการอัลกอริทึมและไม่ว่าฉันจะใช้ Python แบบใดและฉันได้ลองใช้หลายรุ่นแล้วการใช้ CPU จะสูงถึง 25% สูงสุด ทำไม Python ไม่ใช้ประโยชน์จากทรัพยากร CPU ที่เหลืออยู่ ฉันเปลี่ยนลำดับความสำคัญของบริการจากปกติเป็นสูงและใหม่กว่าเป็นเรียลไทม์โดยเริ่มใหม่ในระหว่างนั้น แต่ไม่มีอะไรเปลี่ยนแปลง

มีวิธีทำให้ Python ใช้ CPU ของฉัน 50% ขึ้นไปหรือไม่


ซีพียูของคุณเป็นซีพียูแบบมัลติคอร์หรือไม่?
Geek

ใช่มันคือ i5-480M และในแผงควบคุม> ตัวเลือกพลังงาน> cpu min / max มันอยู่ที่ 100%
Christos K.

คำตอบ:


20

ค่อนข้างง่ายคุณกำลังเรียกใช้แอปพลิเคชั่นเธรดเดียวในระบบที่มีลอจิคัล 4 คอร์ - เช่นนี้คุณมีเพียงหนึ่งกระบวนการโดยใช้คอร์ทั้งหมด

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


ฉันกลัวว่าจะเป็นเช่นนี้ แต่ในไดอะแกรมการใช้งาน cpu ในตัวจัดการงานของ windows ฉันไม่เห็น 1 ไดอะแกรมวางอยู่ในขณะที่อัลกอริทึมถูกดำเนินการในทางตรงกันข้าม
Christos K.

1
ระบบของคุณสมดุลภาระระหว่างคอร์ ถึงกระนั้นก็ไม่มีการใช้สองแกนในครั้งเดียว
gronostaj

พวกคุณยืนยันความกลัวของฉันดูเหมือนว่ามันเป็นเวลาที่ฉันเริ่มอ่านเกี่ยวกับเธรด
Christos K.

@ fractal_7: การทำเกลียวอาจไม่ก่อให้เกิดประโยชน์ตามที่คุณคาดหวัง ดูคำตอบของฉันด้านล่าง
Roland Smith

15

ภาษา Python ถือกำเนิดซีพียูแบบมัลติคอร์มาก่อนจึงไม่แปลกที่มันจะไม่ใช้มัน

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

เมื่อคุณได้ทำมากของการคำนวณที่ฉันสมมติว่าคุณกำลังใช้numpy ? ถ้าไม่ตรวจสอบมันออก มันเป็นส่วนขยายที่เขียนใน C ที่สามารถใช้ไลบรารีพีชคณิตเชิงเส้นที่ปรับให้เหมาะสมเช่น ATLAS สามารถเพิ่มความเร็วในการคำนวณเชิงตัวเลขอย่างมีนัยสำคัญเมื่อเทียบกับ Python มาตรฐาน

ต้องบอกว่ามีหลายวิธีในการใช้หลายแกนกับหลาม

  • ในตัวเป็นmultiprocessingโมดูล multiprocessing.Poolระดับให้ vectorization ข้าม CPU หลายตัวด้วยmap()วิธีการและที่เกี่ยวข้อง แม้ว่าจะมีการแลกเปลี่ยนในที่นี่ หากคุณต้องสื่อสารข้อมูลจำนวนมากระหว่างกระบวนการดังนั้นค่าใช้จ่ายนั้นอาจลบล้างข้อดีของหลายคอร์
  • ใช้งานโครงสร้างที่เหมาะสม หากมีการสร้าง numpy ด้วยไลบรารีมัลติเธรด ATLAS มันจะเร็วขึ้นสำหรับปัญหาใหญ่
  • โมดูลใช้ส่วนขยายเช่นnumexpr , หลามขนาน , corepyหรือโคเปนเฮเกนเวกเตอร์ Byte รหัส

โปรดทราบว่าthreadingโมดูลไม่ได้มีประโยชน์สำหรับการนี้ เพื่อให้การจัดการหน่วยความจำง่ายขึ้นตัวล็อคการแปลสากล ("GIL") บังคับให้มีเพียงหนึ่งเธรดในแต่ละครั้งเท่านั้นที่สามารถประมวลผล python bytecode ได้ โมดูลภายนอกเช่น numpy สามารถใช้หลายเธรดภายในได้


ถึงตอนนี้ฉันใช้ python 2.7 ironpython แล้วและพยายาม pypy ฉันจะให้โอกาสผู้อื่น แต่ฉันก็ยังต้องอ่านก่อนที่ฉันจะสามารถใช้โมดูลหลายตัวประมวลผลได้
Christos K.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.