Sobes.tech
Junior — Middle

რატომ არ იწვევს Python-ში მრავალმხრივი გამოყენება CPU-ზე დამოკიდებული მძიმე გამოთვლების შესრულებისას თვალსაჩინო სიჩქარის გაზრდას?

sobes.tech AI

პასუხი AI-სგან

Python-ის სტანდარტული განსახორციელებაში, CPython იყენებს GIL-ს (Global Interpreter Lock), რაც არის გლობალური ინტერპრეტატორის ლოკი, რომელიც საშუალებას აძლევს მხოლოდ ერთ Python ბაიტკოდს ერთ დროულად მუშაობდეს ერთ თრაკში. ამის გამო, მრავალთრაკიანი მუშაობა არ იძლევა შესრულების გაუმჯობესებას CPU-ზე დამოკიდებული მძიმე გამოთვლების დროს, რადგან თრაკები ვერ მუშაობენ რეალურად პარალელურად რამდენიმე ბირთვზე.

ამ შეზღუდვის გადალახვისთვის გამოიყენება:

  • მრავალი პროცესი (multiprocessing მოდული), სადაც თითოეულ პროცესს აქვს თავისი ინტერპრეტატორი და GIL.
  • C გაფართოებების გამოყენება, რომლებიც გამოთვლების დროს თავისუფლდებიან GIL-დან.
  • ალტერნატიული Python განსახორციელებები GIL-ის გარეშე (მაგ., Jython, IronPython).

მრავალპროცესიანი გამოყენების მაგალითი პარალელური გამოთვლებისთვის:

from multiprocessing import Pool

def heavy_calc(x):
    # მძიმე CPU-ზე დამოკიდებული ფუნქცია
    return x * x

if __name__ == '__main__':
    with Pool(4) as p:
        results = p.map(heavy_calc, range(10))
    print(results)