Көп операциялау осы операция үшін жақсы шешім бола ма?

while True:

    Number = len(SomeList)

    OtherList = array([None]*Number)

    for i in xrange(Number):
        OtherList[i] = (Numpy Array Calculation only using i_th element of arrays, Array_1, Array_2, and Array_3.)

OtherList және басқа массивтердегі элементтердің саны «сан» бөлек есептелуі мүмкін. Алайда, бағдарлама уақытқа тәуелді болғандықтан, элементтердің әрбір «нөмірі» саны өңделмейінше, әрі қарай жұмыс істей алмаймыз.

Көп операциялау осы операция үшін жақсы шешім бола ма? Мен осы процесті барынша жеделдетуге тиіспін. Егер жақсы болса, өтінеміз, кодты ұсыныңыз.

1
Бұдан басқа, көптеген numpy операциялары python Global Interpreter Lock (GIL) пішімінен шығып, numpy ішіндегі көптеген нәрселер үшін көп өңдеуді орнына многопоточность пайдалану үшін. Мен мұны тезірек тауып отырмын, бірақ ақаулықтар мәселе болуы мүмкін.
қосылды автор Brian Larsen, көзі
Егер бірнеше есептеулерді орындау уақыты бір процесті субпроцесстерді жасауға, деректерді таратуға және нәтижелерді жинауға қажет болса асып кетсе, көп мәрте өңдеу жақсы шешім болар еді. Сонымен қатар, бірнеше процессорлар параллель жұмыс істей алатынын болжайды - бір процессорда бірнеше процестерді іске қосудың ешқандай мәні жоқ. Есептеу уақыты әр процестің үстінен біршама асып кетпегенше, көп өңдеулер көп көмектеспейді.
қосылды автор Dave, көзі
Сізде жұмыс істемейтін код бар ма? Сіз профайлыңды қойдыңыз ба?
қосылды автор Steven Rumbalski, көзі
len (Number) сәтсіздікке ұшырайды, себебі сіз санды ұзындығын қабылдай алмайсыз. массиві ([None] * Number) массив жасаудың баяу тәсілі болып көрінеді, себебі ол алдымен тең өлшемді Python тізімін жасайды. Мүмкін сіз массивіңізді бос немесе нөлдер арқылы жасауыңыз керек.
қосылды автор Steven Rumbalski, көзі
Сондай-ақ, бірегей есептеу қалай қиындайды?
қосылды автор Steven Rumbalski, көзі
Алдымен алдымен жолға айналады, содан кейін ұзындығын қабылдайды. len (str (Сан))
қосылды автор John Doe, көзі

2 жауаптар

It is possible to use numpy arrays with multiprocessing but you shouldn't do it yet.

өнімділігін есептеу үшін Python пайдалану үшін жаңадан бастаған нұсқаулық және оның . «> Cython нұсқасы: Python жылдамдығы (NumPy, Cython, және Weave) .

Арнайы есептеулер не массивтердің өлшемдері қандай екенін білмей, мұнда нақты тәртіпте жалпы нұсқаулар бар:

  • measure performance of your code. Find hot-spots. Your code might load input data longer than all calculations. Set your goal, define what trade-offs are acceptable
  • check with automated tests that you get expected results
  • check whether you could use optimized libraries to solve your problem
  • make sure algorithm has adequate time complexity. O(n) algorithm in pure Python can be faster than O(n**2) algorithm in C for large n
  • use slicing and vectorized (automatic looping) calculations that replace the explicit loops in the Python-only solution.
  • rewrite places that need optimization using weave, f2py, cython or similar. Provide type information. Explore compiler options. Decide whether the speedup worth it to keep C extensions.
  • minimize allocation and data copying. Make it cache friendly.
  • explore whether multiple threads might be useful in your case e.g., cython.parallel.prange(). Release GIL.
  • Compare with multiprocessing approach. The link above contains an example how to compute different slices of an array in parallel.
  • Iterate
4
қосылды
Жақсы кеңес! Шын мәнінде, сіз multipprocessing арқылы әдемі numpy массивтерін пайдалана аласыз. Мен мұны әрдайым жасаймын. Мұны істеудің ең қарапайым жолы - ортақ жад пайдаланбағанын білу керек. multiprocessing сізге кез-келген басқа python объектісіне ұқсас етіп жіберуге және оларды жіберуге мүмкіндік береді. Әлбетте, бұл жоғары жүктемеге ие және әрбір «кесінді» көшіріледі, осылайша трюк салыстырмалы түрде үлкен мөлшерде жұмыс істеуге арналған. Бұл мәселеге байланысты, бірақ кейбір жағдайларда өте жылдам тікелей multiprocessing.pool + numpy әдісі бар кейбір жағдайларда өте жақсы жылдамдықты алуға болады.
қосылды автор Joe Kington, көзі
Мұның бәрі айтылды, мен келісемін, multiprocessing - бұл ОС проблемасына жақсы сай келмеуі мүмкін және олар басқа тәсілдермен оңтайландырылған.
қосылды автор Joe Kington, көзі
Рақмет сізге! Мен кодты оңтайландыру үшін уақытты өткізгім келеді.
қосылды автор user989746, көзі

Егер сізде while True сөйлемі бар болса, онда, егер итерациялар болса, онда әлеуетті кірістер, нәтижесінде, көп өңдеу пулының уылдырықтандыруынан баяулаудан асып түсетіндіктен, сіз көп жұмыс істейтін боласыз деп болжаймын. Сондай-ақ, сіздің компьютеріңізде айқын себептер бойынша бірнеше логикалық ядро ​​бар деп ойлаймын. Сонда мәселе кірістерді сериялауға және нәтижені серияландыруға жұмсалатын шығындардың пайда болуымен байланысты болады.

Білудің ең жақсы тәсілі - жетістікке қол жеткізуге болатын нәрсе бар ма, менің тәжірибем - оны сынап көру. Мен мыналарды ұсынамын:

  • Бастау кезіндегі кез-келген тұрақты енгізуді өткізесіз. Осылайша, егер Array_1, Array_2 және Array_3 кез келген өзгертулер ешқашан өзгермесе, Process() деп қоңырау шалғанда оны args ретінде жіберіңіз. Осылайша IPC арқылы таңдауға және жіберуге қажет деректердің көлемін азайтады ( multiprocessing )
  • Жұмыс кезегін пайдаланып, оған қол жетімді болғанда тапсырмаларды қосыңыз. Осылайша, сіз процесті тапсырма бойынша жасаған кезде әрқашан көп жұмыс күтіп тұрғанына көз жеткізе аласыз.
0
қосылды