使用Cython最大化性能增加

2024-04-20 08:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试编写一个图形化的应用程序,在大学的一个项目中演示机器学习,我一直在用Python开发它。因为Python是一种相当慢的语言,所以我在寻找加速运行时执行的方法,偶然发现了Cython。我对C/C++还不太熟悉,但是我已经尽可能静态地输入了我的代码(尽管警告说这可以降低可读性/灵活性;这不是我目前最关心的)。在

然而,我并没有注意到这个实现比纯Python有任何显著的改进,我想知道是否有人对如何加速它有任何建议。我会很高兴有10倍的加速,虽然我不确定这有多现实。在

̶I̶̶I̶h̶a̶v̶e̶n̶̶p̶r̶o̶f̶f̶I̶l̶e̶d̶̶m̶y̶̶c̶o̶o̶̶̶t̶̶p̶̶y̶e̶我已经分析了我的代码,结果链接在下面。在

因为它仍然是一个正在进行的工作,布局不是很好,但我已经做了一些简单的功能分组。在

源代码可以找到here。代码中最相关的部分发布在下面。在

一。在

迭代给定焊盘的内存:

cdef findBestApproximation(int padindex):
    cdef double last_collision_x
    cdef double last_collision_y
    cdef double last_collision_i_angle
    cdef double last_collision_i_speed
    cdef double last_collision_f_angle
    cdef double last_collision_f_speed
    cdef double x_divergence
    cdef double y_divergenve
    cdef double f_angular_divergence
    cdef double divergence

    printData("FINDING APPROXIMATION FOR PAD %s...\n" % padindex)
    pad = Pads.padlist[padindex]
    memory = pad.memory
    ball = Balls.ball
    if not memory:
        approximation = getPadMidpoint(padindex)
        return approximation

    collision_data = getCollisionData()
    (last_collision_x, last_collision_y, last_collision_i_angle,
     last_collision_i_speed, last_collision_f_angle,
     last_collision_f_speed) = collision_data

    best_approx = 0
    strictness_coef = 1.03

    for memory_tuple in memory:
        (x_miss, y_miss, x_collision, y_collision, _, _, f_angle, _) = memory_tuple.getData()
        (divergence, x_divergence, y_divergence, f_angular_divergence) = calculateDivergence(memory_tuple, collision_data)

        divergence = x_divergence + y_divergence + f_angular_divergence

        approximation = (divergence, x_miss, y_miss)

        printData("\n\nPAD: %s" % padindex)
        printData("\nLAST COLLISION (X) = %s, CONSIDERED CASE (X) = %s" % (last_collision_x, x_collision))
        printData("pos_x DIVERGENCE: %s" % x_divergence)

        printData("\nLAST COLLISION (Y) = %s, CONSIDERED CASE (Y) = %s" % (last_collision_y, y_collision))
        printData("pos_y DIVERGENCE: %s" % y_divergence)

        printData("\nLAST COLLISION (fAngle) = %s, CONSIDERED CASE (fAngle) = %s" % (last_collision_f_angle, f_angle))
        printData("FINAL ANGLE DIVERGENCE: %s" % f_angular_divergence)

        printData("\nTOTAL DIVERGENCE: %s\n\n" % divergence)

        if not best_approx:
            best_approx = approximation
        else:
            (least_divergence, _, _) = best_approx 
            if divergence < least_divergence:
                best_approx = approximation

    (_, pos_x, pos_y) = best_approx
    approximation = (pos_x, pos_y)
    return approximation

一。在

计算并将分数归因于存储在pad存储器中的特定过去事件:

^{pr2}$

编辑:Here's分析代码的结果。DrawSettingsMenu()是最差的一个,但可以忽略它(默认情况下不显示设置菜单)。任何“初始化…”功能也可以忽略。在


Tags: 代码posbestlastdoublespeedmemorycdef
2条回答

你应该首先分析你的代码,看看有什么需要优化。 然后你应该尽可能地优化算法。 如果您在Python中识别出一个速度太慢的函数,可以尝试使用Cython静态地键入它,但是用C编写并从Cython调用它将获得更好的性能。但在优化代码之前,请确保代码的行为正确,否则会浪费时间。在

如果您只想让它更快,可以尝试另一种Python实现,比如PyPy或{a2}。如果您使用的是较旧版本的Python,您可能还想看看Psyco。在

相关问题 更多 >