优化性能 - 使用Python

时间:2017-01-20 14:50:21

标签: python multithreading opencv python-multithreading

我使用 OpenCV3.2 Python 有关的性能问题。我刚刚将另一个子系统集成到我的主程序中,它减慢了很多。

这是我的初始代码没有集成新子系统,我使用cv2.getTickCount来衡量时间,如OpenCv3.2 Official Website所示。

# Infinite loop
while True:
    # getting tick count
    e1 = cv2.getTickCount()
    # storing frame
    _, img = cap.read()

    # define red colours in the screen
    findRedColours(img, board)
    # getting tick count after the functions
    e2 = cv2.getTickCount()
    # calculating time
    t = (e2 - e1) / cv2.getTickFrequency()
    # print time
    print(t)

    # check if img is none
    if img is not None:
        # omitted code

        k = cv2.waitKey(20) & 0xFF
        # start the game, hide info
        if (k == ord('s') or k == ord('S')) and start is False:
            # create new thread to play game
            t = Thread(target=playGame)
            t.start()

基本上,我在无限循环中调用一个函数来查找红色,按开始我创建线程并开始游戏。

这是之前所需的时间我按'S'创建主题:

0.019336862
0.016924178
0.022487864

这是之后所需的时间我按'S'创建主题:

0.091731532
0.125760734
0.098221829

这里一切正常,时间有轻微的变化,但没什么太重要的。添加新子系统时,我开始遇到问题。这里的代码与新系统的集成,它与前一个代码相同,只是一个函数调用改变了:

# Infinite loop
    while True:
        # getting tick count
        e1 = cv2.getTickCount()
        # storing frame
        _, img = cap.read()
        # extract grid
        gridExtractor.extractGrid(img)
        # define red colours in the screen
        findRedColours(img, board)
        # getting tick count after the functions
        e2 = cv2.getTickCount()
        # calculating time
        t = (e2 - e1) / cv2.getTickFrequency()
        # print time
        print(t)

        # check if img is none
        if img is not None:
            # omitted code

            k = cv2.waitKey(20) & 0xFF
            # start the game, hide info
            if (k == ord('s') or k == ord('S')) and start is False:
                # create new thread to play game
                t = Thread(target=playGame)
                t.start()

这是之前的时间我创建线程:

0.045629524
0.023788123
0.10517206

略高于没有集成的那个,但仍然可以。这是之后我创建线程的时间:

1.061517957
0.568310864
0.691701059

这个与前一个之间存在巨大差异,它甚至达到了整整一秒。即使从相机输出也很明显,真的很慢。

我的问题是,我是否以错误的方式创建了我的主题?有一种更好,更有效的方式来使用Threads吗?或者在这种情况下实际上是否有一种优化性能的方法,而无需修改这些函数findRedColours(img, board)t = Thread(target=playGame)gridExtractor.extractGrid(img)

我是使用OpenCV和Python的新手,但仍然遇到麻烦。希望有人能以正确的方式对我说话。谢谢。

1 个答案:

答案 0 :(得分:0)

感谢上述帮助评论的用户'deets',优化效果

在这种情况下,足以用Python中的multiprocessing模块替换Thread with Process。

from multiprocessing import Process
#omitted code

while True:
    # getting tick count
    e1 = cv2.getTickCount()
    # storing frame
    _, img = cap.read()
    # extract grid - first subsystem
    gridExtractor.extractGrid(img)
    # define red colours in the screen - second subsystem
    findRedColours(img, board)
    # getting tick count after the functions
    e2 = cv2.getTickCount()
    # calculating time
    t = (e2 - e1) / cv2.getTickFrequency()
    # print time
    print(t)

    # check if img is none
    if img is not None:
        # omitted code

        k = cv2.waitKey(20) & 0xFF
        # start the game, hide info
        if (k == ord('s') or k == ord('S')) and start is False:
            # create new thread to play game
            p = Process(target=playGame)
            p.start()

所需的相对时间是:

0.022570883
0.11354852
0.119643379

与Thread相比,使用Process在性能方面更有效。