如何降低使用matplotlib绘制黑色立方体的代码运行耗时
Matplotlib绘制黑色立方体的性能优化方案
原代码存在两个核心性能问题:
- 三层循环共调用
plot3D超过1600万次,函数调用开销占了绝大多数耗时 - 绘制了立方体内部所有冗余点,实际展示立方体只需要线框或表面数据,完全不需要遍历内部点
具体优化方案根据需求分为两类:
场景1:绘制黑色线框立方体
只需要构造立方体的8个顶点和12条棱的坐标,批量绘制即可,仅需调用12次绘图接口,耗时不到原代码的万分之一:
import matplotlib.pyplot as plt import numpy as np ax = plt.axes(projection='3d') # 立方体8个顶点坐标 (x,y,z),范围0到255 vertices = np.array([[0,0,0], [255,0,0], [255,255,0], [0,255,0], [0,0,255], [255,0,255], [255,255,255], [0,255,255]]) # 12条棱对应的顶点索引 edges = [[0,1], [1,2], [2,3], [3,0], [4,5], [5,6], [6,7], [7,4], [0,4], [1,5], [2,6], [3,7]] # 批量绘制所有棱 for edge in edges: ax.plot3D(vertices[edge, 0], vertices[edge, 1], vertices[edge, 2], 'black') # 固定坐标轴范围和比例,避免立方体变形 ax.set_xlim(0,255) ax.set_ylim(0,255) ax.set_zlim(0,255) ax.set_box_aspect([1,1,1]) plt.show()
场景2:绘制填充的黑色立方体
使用Poly3DCollection批量绘制6个面,性能更高:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection import numpy as np ax = plt.axes(projection='3d') vertices = np.array([[0,0,0], [255,0,0], [255,255,0], [0,255,0], [0,0,255], [255,0,255], [255,255,255], [0,255,255]]) # 6个面对应的顶点索引 faces = [[vertices[j] for j in [0,1,2,3]], [vertices[j] for j in [4,5,6,7]], [vertices[j] for j in [0,1,5,4]], [vertices[j] for j in [2,3,7,6]], [vertices[j] for j in [0,3,7,4]], [vertices[j] for j in [1,2,6,5]]] ax.add_collection3d(Poly3DCollection(faces, facecolor='black', edgecolor='black')) ax.set_xlim(0,255) ax.set_ylim(0,255) ax.set_zlim(0,255) ax.set_box_aspect([1,1,1]) plt.show()
补充说明
如果你确实需要绘制立方体范围内的大量散点,也不要循环调用plot3D,改用scatter接口一次传入所有坐标数组,性能会提升百倍以上。所有matplotlib绘图场景都要尽量避免循环调用绘图接口,优先使用批量传参的方式降低开销。
内容的提问来源于stack exchange,提问作者Shlok
相关产品推荐
相关产品推荐

