python - tkinter 非常慢 - 如何加快速度或使用不同的库?

标签 python graph plot tkinter 2d

我正在使用 tkinter 生成 2D 形态发生图。我发现它非常慢。例如,此脚本在我的 8 核 Xeon 上花费了近 10 秒:

#!/usr/bin/env python3

import random
import tkinter as tk

A = 3.419384662527591
B = 2.0158889752347022
C = 19.479697084985673
D = 61.006212908774614
F = 1.3449991745874286
G = 1.9590223710983992
H = 5.129501734860241
WIDTH = 800
HEIGHT = 600


class Morphogenic(tk.Frame):

    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.canvas = tk.Canvas(width=WIDTH, height=HEIGHT, borderwidth=1)
        self.canvas.pack(side="top", fill="both", expand=True)

    def rand(self):
        A = 3 + random.random() * 10
        B = 1 + random.random() * 5
        C = 1 + random.random() * 20
        D = 1 + random.random() * 200
        F = 1 + random.random() * 2
        G = 1 + random.random() * 20
        H = 1 + random.random() * 20

    def draw(self):
        points = [0] * HEIGHT
        points_space = [0] * HEIGHT
        points_energy = [0] * HEIGHT
        w = WIDTH
        h = HEIGHT
        min_x = 0

        last_x = 0
        last_y = 0

        while min_x < w:
            min_x = w
            lrand = 0

            for y in range(1, h):
                points_space[y] = points_space[y] + \
                    (points_space[y - 1] - points_space[y]) / F

            for y in range(0, h):
                lrand = lrand + (random.random() - 0.5) / C
                new_point = points[y] + points_space[y] + lrand
                points_space[y] = (new_point - points[y]) + \
                    points_energy[y] / G
                points_space[y] = points_space[y] + (A - points_space[y]) / D
                points_energy[y] = points_energy[y] / H

                if (points_space[y] < B):
                    points_energy[y] = points_space[y] - B
                    points_space[y] = B

                points[y] = points[y] + points_space[y]

                if (min_x > points[y]):
                    min_x = points[y]

                self.canvas.create_line(last_x, last_y, points[y], y)
                last_x = points[y]
                last_y = y


if __name__ == "__main__":
    root = tk.Tk()
    m = Morphogenic(root)
    m.pack(fill="both", expand=True)
    m.rand()
    m.draw()
    root.mainloop()

tkinter 对于这种工作来说太弱了吗?我应该考虑不同的 2D 库吗?

最佳答案

您的代码正在创建超过 150,000 行。这开始推动画布小部件的性能。它可以很容易地处理数千个项目,甚至数万个项目。 150,000 件元素比其设计处理能力稍多一些。

关于python - tkinter 非常慢 - 如何加快速度或使用不同的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20624833/

相关文章:

python - 为什么我得到 "IndexError: string index out of range"?

python - 在python中创建3D矩阵的2D投影

python - 在pygame中移动三角形

python - seaborn swarmplot 中离散类别的可变间距

objective-c - 为什么图表隐藏在 coreplots ios 中?如何从轴组中取出前面?

python - Networkx 度数方法没有产生 want 我认为是

javascript - Flot.js 条和线不动

Matlab 在不重新绘制的情况下更改绘图中的单个点

r - Ggplot 不显示源函数中的绘图

python - 使用healpy使用HEALPix像素化制作2D直方图