Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在图形上绘制多个图形时避免for循环_Python_Performance_For Loop_Matplotlib_Plot - Fatal编程技术网

Python 在图形上绘制多个图形时避免for循环

Python 在图形上绘制多个图形时避免for循环,python,performance,for-loop,matplotlib,plot,Python,Performance,For Loop,Matplotlib,Plot,我正在绘制大约10000次迭代的错误函数值,绘制它们需要很多时间。 如果可能的话,我想避免for循环,将它们全部绘制在一个图形中,但无论如何都要加快速度 import time import matplotlib.pyplot as plt a = time.time() for one in range(len(data)): plt.plot(data[one],"-o") plt.show() b = time.time() print(b-a) 我尝试的是时间: (plt

我正在绘制大约10000次迭代的错误函数值,绘制它们需要很多时间。 如果可能的话,我想避免for循环,将它们全部绘制在一个图形中,但无论如何都要加快速度

import time
import matplotlib.pyplot as plt
a = time.time()

for one in range(len(data)):
    plt.plot(data[one],"-o")
plt.show() 

b = time.time()
print(b-a)
我尝试的是时间:

(plt.plot(data[one],"-o") for one in range(len(data)))
plt.show()
但它没有显示任何绘图。因此,我的目标是加快绘图速度,并在遇到瓶颈时删除for循环

数据是

data = array([[  0. ,   0. ,   0. ,   0. ,   0. ],
       [-43.4, -18. , -10.5,  -7.4,  -5.7],
       [ 25.7,  18.3,  13.8,  10.7,   8.6],
       [-25. , -10. ,  -5.8,  -4.2,  -3.3],
       [ 16.1,  11.5,   8.6,   6.5,   5.1],
       [-16.2,  -6.4,  -3.8,  -2.9,  -2.4],
       [  9.6,   7.1,   5.2,   3.8,   2.9],
       [ -9.1,  -3.4,  -2. ,  -1.6,  -1.5],
       [  4.7,   3.9,   2.9,   2. ,   1.4],
       [ -4.5,  -1.3,  -0.7,  -0.8,  -0.8]])
如果重要的话,x轴可以被视为

n = [i for i  in range(5)]
这有点“欺骗”,但可以用并行处理器包装python函数。例如,如果您有一个8核处理器,您可以使用7核并行运行您的函数,或者使其速度提高7倍

import matplotlib.pyplot as plt
from multiprocessing import Pool, cpu_count

def multi_processor(function_name):

    # Use max number of system processors - 1
    pool = Pool(processes=cpu_count()-1)
    pool.daemon = True

    results = {}
    # for every item in your list of items, start a new process
    for one in range(len(data)):
        results[one] = pool.apply_async(your_function, args=(data[one]))

    # Wait for all processes to finish before proceeding
    pool.close()
    pool.join()

    # Results and any errors are returned
    return {your_function: result.get() for your_function, result in results.items()}

def your_function(arg1):
    try:
        return plt.plot(arg1,"-o")
    except Exception as e:
        return str(e)

if __name__ == "__main__":
    multi_processor("your_function")
    plt.show()

为了避免循环,您可以进行
plt.plot(范围(5),data.T)
。对于for循环,阵列的转置为每个循环478 ms±35.2 ms(平均±标准偏差7次,每个循环1次),对于不同的计时,每个循环11.7 ms±2.24 ms(平均±标准偏差7次,每个循环100次),请参阅,但我不知道这里提到的任何其他选项是否适用于您的案例。我尝试使用LineCollection,但得到了
ValueError:在我堆叠数据和n之后,所有输入数组必须具有相同的形状。但是当我使用time.time时,你的第一条评论速度提高了10倍,它们是~400ms到~40ms。正如你可能理解的,早期的计时是从jupyter开始的。我假设我们已经用完了矩阵和线集合,可以使用NAN吗?这无疑是有用的,我稍后会使用它(在学习之后),但到目前为止,我正在做的作业将在有限的库中进行测试。我认为这现在没有用。你真的测试过这个吗?它会产生一个单独的绘图还是5个?不,我没有针对这个问题测试它,但我已经在其他函数上测试过很多次了。我没有绘制一些东西,而是使用print语句来演示并行处理功能。通用版本在这里还可以,我建议用一个实际的绘图来测试它,因为根据我的经验,多处理会产生新的进程,这些进程在分离后无法合并到单个输出绘图中。如果我弄清楚在哪里放置
数据
变量,我会尝试。我正在使用一个新文件。得到
TypeError:your_函数()接受1个位置参数,但给出了5个