Многопроцессорный участок Python - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над созданием трехмерного папоротника Барнсли, я получил его, но он требует слишком много итераций, поэтому он очень медленный. Я пытался реализовать мультипроцессорное решение, но я не знаю, как я могу объединить графики. Прямо сейчас он показывает несколько графиков. Можете ли вы дать мне какой-нибудь совет, как это сделать? вот мой код:

import numpy as np
import matplotlib.pyplot as plt
import os
from mpl_toolkits.mplot3d import Axes3D
from multiprocessing import Process
import dill
import pickle

f11 = [0.00, 0.00,  0.01,  0.00,  0.26,  0.00,  0.00,  0.00,  0.05,  0.00,  0.00,  0.00]
f21 = [0.20, -0.26, -0.01,  0.23,  0.22, -0.07,  0.07,  0.00,  0.24,  0.00,  0.80,  0.00]
f31 = [-0.25,  0.28,  0.01,  0.26,  0.24, -0.07,  0.07,  0.00,  0.24,  0.00,  0.22,  0.00]
f41 = [0.85,  0.04, -0.01, -0.04,  0.85,  0.09,  0.00,  0.08,  0.84,  0.00,  0.80,  0.00]

f12 = [0.05,  0.00,  0.00,  0.00, 0.60,  0.00,  0.00,  0.00,  0.05, 0.00, 0.00, 0.00]
f22 = [0.45, -0.22,  0.22,  0.22, 0.45,  0.22, -0.22,  0.22, -0.45, 0.00, 1.00, 0.00]
f32 = [-0.45,  0.22, -0.22,  0.22, 0.45,  0.22,  0.22, -0.22,  0.45, 0.00, 1.25, 0.00]
f42 = [0.49, -0.08,  0.08,  0.08, 0.49,  0.08,  0.08, -0.08,  0.49, 0.00, 2.00, 0.00]

x = [0]
y = [0]
z = [0]


def f(f,x,y,z):
    val1,val2,val3 = (f[0] * x + f[1] * y + f[2] * z, f[3] * x + f[4] * y + f[5] * z + f[10],
              f[6] * x + f[7] * y + f[8] * z)
    return val1,val2,val3

def plotFern(iters,x,y,z):
    fig = plt.figure(1)
    ax = plt.axes(projection='3d')
    xx,yy,zz = [],[],[]
    for i in range(iters):
        ran = np.random.rand(1)
        if ran <=0.01:
            x,y,z = f(f11,x,y,z)
        if ran > 0.01 and ran <= 0.08:
            x, y, z = f(f21, x, y, z)
        if ran > 0.08 and ran <= 0.93:
            x, y, z = f(f31, x, y, z)
        if ran > 0.93 and ran <= 1:
            x, y, z = f(f41, x, y, z)
        xx.append(x)
        yy.append(y)
        zz.append(z)
    print(xx,yy,zz)
    ax.scatter3D(xx, yy, zz, s=0.9, edgecolor='green')
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    plt.show(block=True)



if __name__ == '__main__':
    iter = 100000

    width, height = 300, 300
    aimg = np.zeros((width, height))
    x, y, z = 0, 0, 0
    processes = []
    #plotFern(iter, x, y, z)
    for i in range(os.cpu_count()):
        processes.append(Process(target=plotFern, args=(iter, x, y, z,)))


    for process in processes:
        process.start()

    for process in processes:
        process.join()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...