Rumah  >  Soal Jawab  >  teks badan

Python - Bagaimana untuk menggunakan pelbagai proses untuk menyelesaikan masalah sarang gelung perlahan?

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
代言代言2685 hari yang lalu2235

membalas semua(6)saya akan balas

  • 学习ing

    学习ing2017-06-12 09:24:04

    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.

    balas
    0
  • PHP中文网

    PHP中文网2017-06-12 09:24:04

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

    balas
    0
  • 为情所困

    为情所困2017-06-12 09:24:04

    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)

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-06-12 09:24:04

    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)

    balas
    0
  • typecho

    typecho2017-06-12 09:24:04

    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()
                           

    balas
    0
  • 怪我咯

    怪我咯2017-06-12 09:24:04

    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

    balas
    0
  • Batalbalas