使用numba的姿势不正确反而导致性能下降


numba能够极大的提高python在计算方面的性能。是不是所有的python代码上,都可以加上numba.jit装饰器?答案是否定的。

示例

  • 环境
python3.6
fedora
pymysql
  • 示例

很常见的例子,从数据库从查询一千条数据,再进行简单的格式转换。

#coding=utf-8
import time
from numba import jit

import pymysql
conn = pymysql.connect("192.168.10.125", "username", "password", "db_name")

#@jit   #位置1
def test_for():
    c =conn.cursor()
    c.execute("select * from user limit 1000")

    start = time.time()
    for a in c.fetchall():
        to_dict(a, c.description)
    end = time.time()
    print("cost_seconds:", end-start)

#@jit   #位置2
def to_dict(row, description):
    """
    记录转为字典
    """
    item = dict()
    for i, field in enumerate(description):
        field_name = field[0]
        item[field_name] = row[i]
    return item

test_for()
  • 结果
python3           0.0033788681030273438
python3 +位置1jit 0.08921098709106445
python3 + 位置1jit+位置2jit  3.846426010131836
pypy              0.0065860748291015625

对比结果,发现如果是非计算问题,引入即时编译,反而导致性能下降。实际python在非计算问题上性能很好。



上篇: numba加速python学习与尝试 下篇: 学习:人工智能-机器学习-深度学习概念的区别