Python - Bagaimana untuk menggunakan pelbagai proses untuk menyelesaikan masalah sarang gelung perlahan?
代言
代言 2017-06-12 09:22:04
0
6
2256

Terdapat corak gelung dalam gelung
Dalam badan gelung gelung dalam, pembolehubah gelung besar dan gelung kecil mesti digunakan pada masa yang sama.

Saya telah memudahkannya menjadi model yang mudah di sini
Model ini akan menjadi sangat perlahan jika fungsinya kompleks
Saya ingin bertanya bagaimana menggunakan pelbagai proses untuk menyelesaikan masalah kelajuan.

Idea saya ialah menggunakan pelbagai proses hanya untuk gelung kecil,
tulis kod berbilang proses dalam badan gelung gelung besar,
tetapi ia tetap gagal,
tolong minta Tuhan berikan kod yang betul.

Terima kasih!

import random as r
list1=list(range(100))
i=0
reslist=[]
while i<2000:#大循环
    alist=[]#三个列表变量,每次循环开始时清空
    blist=[]
    clist=[]
    for each in list1:#小循环
        x=r.randint(i+30,i+60)+each#涉及到大、小循环变量的几个函数,这里用random示意
        y=r.randint(i+60,i+120)+each
        z=r.randint(i+60,i+180)+each
        
        res=2.5*x-y-z
        reslist.append(res)#对函数结果进行操作
        if res>=50:
            alist.append(each)
        if -50<res<50:
            blist.append(each)
        if res<=-50:
            clist.append(each)
            
    for each in alist:#在大循环中对小循环中得出的结果进行进一步其他操作
        print(each)
    for each in blist:
        print(each)
    for each in clist:
        print(each)
    
    i+=1
代言
代言

membalas semua(6)
学习ing

Pertama sekali, pengkomputeran selari memerlukan tiada hubungan sebab akibat bersama antara subrutin setiap operasi selari.
Dalam gelung kecil, res mempunyai hubungan sebab akibat rapat dengan x, y, z dan alist, blist dan clist, dan sukar untuk membahagikannya kepada pengiraan selari.
Walaupun kod yang disiarkan oleh penyoal bukan kod asal, saya tidak tahu sama ada terdapat hubungan sebab akibat antara gelung besar dalam kod asal Namun, jika dilihat dari kod skema,
memecahkan gelung besar kepada N benang (tiada proses diperlukan) hendaklah Ya, setiap benang mengira 2000/N kali.
Sebagai contoh, dibahagikan kepada 8 utas, utas 1 mengira i=0 hingga 249, utas 2 mengira i=250 hingga 499, dan seterusnya. . .
Saiz N di sini boleh ditentukan mengikut bilangan teras CPU Jika N melebihi bilangan teras CPU, ia tidak akan masuk akal, tetapi ia mungkin mengurangkan kecekapan.

洪涛

Anda harus menggunakan elif di tengah nampaknya ada sesuatu yang tidak kena dengan lekukan untuk di hujung

为情所困

Anda boleh membuka berbilang proses dalam gelung besar, contohnya, jika gelung besar adalah 2000 kali, jika bilangan teras CPU ialah 4, maka 4 proses akan dibuka, dan setiap proses akan bertanggungjawab untuk menjalankan 500

Selepas gelung kecil tamat, anda boleh membuka sub-benang untuk melaksanakan operasi seterusnya berikut, dan gelung besar terus memproses ke hadapan

for each in alist:#在大循环中对小循环中得出的结果进行进一步其他操作
    print(each)
for each in blist:
    print(each)
for each in clist:
    print(each)
phpcn_u1582

Anda boleh menggunakan sub-proses untuk mengendalikan gelung kecil, tetapi dalam kes ini anda memerlukan dua gelung besar. Satu gelung mengendalikan gelung kecil, dan selepas gelung ini diproses, gelung besar mengendalikan perkara berikut

Seperti ini

import random as r


def cumput(i, list1):
    alist = []
    blist = []
    clist = []
    reslist = []
    for each in list1:  # 小循环
        x = r.randint(i + 30, i + 60) + each  # 涉及到大、小循环变量的几个函数,这里用random示意
        y = r.randint(i + 60, i + 120) + each
        z = r.randint(i + 60, i + 180) + each

        res = 2.5 * x - y - z
        reslist.append(res)  # 对函数结果进行操作
        if res >= 50:
            alist.append(each)
        if -50 < res < 50:
            blist.append(each)
        if res <= -50:
            clist.append(each)
    return alist, blist, clist, reslist


if __name__ == '__main__':
    multiprocessing.freeze_support()
    list1 = list(range(100))
    i = 0
    pool = multiprocessing.Pool(2)
    res = {}
    while i < 2000:  # 大循环
        res[i]=pool.apply_async(cumput, (i, list1,))
        i += 1
    pool.close()
    pool.join()
    for i in res:
        for each in res[i].get()[0]:  # 在大循环中对小循环中得出的结果进行进一步其他操作
            print(each)
        for each in res[i].get()[1]:
            print(each)
        for each in res[i].get()[2]:
            print(each)
typecho

Jika fungsi yang dilaksanakan dalam gelung kecil memakan masa, anda boleh mempertimbangkan model pengeluar-pengguna


import random
from threading import Thread
from Queue import Queue

resqueue = Queue()
aqueue = Queue()
bqueue = Queue()
cqueue = Queue()

def producer():
    list1=list(range(100))
    
    for _ in range(2000):
        for each in list1:
            x=r.randint(i+30,i+60)+each
            y=r.randint(i+60,i+120)+each
            z=r.randint(i+60,i+180)+each
            
            res=2.5*x-y-z
            resqueue.put(res)
            
            if res>=50:
                aqueue.put(each)
            if -50<res<50:
                bqueue.put(each)
            if res<=-50:
                cqueue.put(each)

def consumer_a():
    while True:
        try:
            data = aqueue.get(timeout=5)
        except Queue.Empty:
            return
        else:
            # 耗时操作
            deal_data(data)
            aqueue.task_done()
            
def consumer_b():
    while True:
        try:
            data = bqueue.get(timeout=5)
        except Queue.Empty:
            return
        else:
            # 耗时操作
            deal_data(data)
            bqueue.task_done()
            
 def consumer_c():
    while True:
        try:
            data = cqueue.get(timeout=5)
        except Queue.Empty:
            return
        else:
            # 耗时操作
            deal_data(data)
            cqueue.task_done()

 def consumer_res():
    while True:
        try:
            data = resqueue.get(timeout=5)
        except Queue.Empty:
            return
        else:
            # 耗时操作
            deal_data(data)
            resqueue.task_done()
            
if __name__ == "__main__":
    t1 = Thread(target=producer)
    t2 = Thread(target=consumer_a)
    ...
    
    t1.start()
    t2.start()
                       
刘奇

Perlukah penyoal mereka bentuk input dan output proses terlebih dahulu Jika berbilang proses melakukan pengkomputeran selari, komunikasi antara proses adalah yang paling penting Setahu saya, ia mestilah MPI, seperti gelung berbilang lapisan, dan bahagian daripada data harus diedarkan terlebih dahulu Pergi ke setiap proses, setiap proses melakukan pengiraan dan kemudian kembali ke titik penyepaduan data, dan kemudian menggabungkan hasilnya dan mengeluarkannya.

Satu lagi perkara penting adalah untuk menganggarkan masa pelaksanaan setiap proses Lagipun, jika terdapat komunikasi antara proses, masa menunggu juga akan membawa kepada penurunan kecekapan.

@daijianke berkata bahawa sarang anda tidak mematuhi peraturan input pengkomputeran selari Anda boleh lihat contoh ini

http://blog.csdn.net/zouxy09/...

Saya telah menguji contoh dalam artikel sebelum ini dan tidak ada masalah Jika anda mengikuti langkah-langkah ini, anda sepatutnya dapat menyelesaikannya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!