Rumah > Soal Jawab > teks badan
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
学习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.
PHP中文网2017-06-12 09:24:04
Anda harus menggunakan elif di tengah nampaknya ada sesuatu yang tidak kena dengan lekukan untuk di hujung
为情所困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)
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)
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()
怪我咯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