python - 将 numba 添加到 python 脚本
问题描述
我试图将 numba 应用于以下脚本以减少运行时间,但没有成功。关于如何做到这一点的任何建议?我在 spyder/anaconda 中使用 python 3.7 工作。
import timeit
start = timeit.default_timer()
from PIL import Image, ImageDraw # Importerer biblioteket
# Load image:
input_image = Image.open("beatles.jpg") # Loads an image from the hard drive
input_pixels = input_image.load()
# Box Blur kernel
box_kernel = [[1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9]]
# Select kernel here:
kernel = box_kernel
# Middle of the kernel
offset = len(kernel) // 2
# Creating the output image
output_image = Image.new("RGB", input_image.size)
draw = ImageDraw.Draw(output_image)
# Beregne konvolusjon mellom intensity (original bilde) og kernel
for x in range(offset, input_image.width - offset):
for y in range(offset, input_image.height - offset):
acc = [0, 0, 0]
for a in range(len(kernel)):
for b in range(len(kernel)):
xn = x + a - offset
yn = y + b - offset
pixel = input_pixels[xn, yn]
acc[0] += pixel[0] * kernel[a][b]
acc[1] += pixel[1] * kernel[a][b]
acc[2] += pixel[2] * kernel[a][b]
draw.point((x, y), (int(acc[0]), int(acc[1]), int(acc[2])))
output_image.save("Beatles box blur.png")
stop = timeit.default_timer()
print('Time: ', stop - start)
解决方案
我在这里做了一些快速的事情,希望它可以让你开始:
import time
import numpy as np
from numba import jit
def numba_off(offset, width, height, kernel):
for x in range(offset, width - offset):
for y in range(offset, height - offset):
acc = [0, 0, 0]
for a in range(len(kernel)):
for b in range(len(kernel)):
pixel = [1, 1, 1]
acc[0] += pixel[0] * kernel[a][b]
acc[1] += pixel[1] * kernel[a][b]
acc[2] += pixel[2] * kernel[a][b]
@jit(nopython=True)
def numba_on(offset, width, height, kernel):
for x in range(offset, width - offset):
for y in range(offset, height - offset):
acc = [0, 0, 0]
for a in range(len(kernel)):
for b in range(len(kernel)):
pixel = [1, 1, 1]
acc[0] += pixel[0] * kernel[a][b]
acc[1] += pixel[1] * kernel[a][b]
acc[2] += pixel[2] * kernel[a][b]
box_kernel = np.array([[1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9]])
kernel = box_kernel
offset = len(kernel) // 2
start = time.time()
numba_off(offset, 1000, 1000, kernel)
end = time.time()
print("Elapsed (without) = %s" % (end - start))
start = time.time()
numba_on(offset, 1000, 1000, kernel)
end = time.time()
print("Elapsed (with compilation) = %s" % (end - start))
start = time.time()
numba_on(offset, 1000, 1000, kernel)
end = time.time()
print("Elapsed (after compilation) = %s" % (end - start))
您应该能够在此基础上再接再厉。阅读这样的内容可能对您有好处:5 分钟 numba 指南
推荐阅读
- cluster-analysis - 为 Kmeans 聚类选择 K 值
- window - 在 Windows 10 中找不到 Inf2Cat
- swift - 让听众知道何时在 dynamodb 中更新了令人兴奋的项目
- asp.net-core-webapi - LINQ 查询仅选择内部列表(JSON 响应中的问题)
- azure - 如何将标签添加到在 Microsoft Azure 中创建的文件存储、队列存储和表存储
- python - 如何在使用 python 的不同客户的特定月数后计算出平均值?
- json - 带有 GraphQL 解析错误的 Google Apps 脚本 API 请求
- java - 程序计算 1250 小时后的时间?
- javascript - 如何获取作为标头添加的值以响应从服务器到客户端(在 reactjs 中)?
- oracle-apex - 如何获取项目“数据库列”名称