如果你喜欢性能,最好避免导入并使用自己优化的代码
以下是 colorsys 的确切代码,稍作修改以使字节码稍快:
def hsv_to_rgb(h, s, v):
if s == 0.0: return (v, v, v)
i = int(h*6.) # XXX assume int() truncates!
f = (h*6.)-i; p,q,t = v*(1.-s), v*(1.-s*f), v*(1.-s*(1.-f)); i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
输出:
>>> hsv_to_rgb(359,1,1)
[1, 0.0, 0.0]
使用像上面这样的 if 链实际上比使用 elif 更快
使用包装器,就像 Cyber 的回答一样,需要一些额外的步骤让解释器执行。
另外,Cyber 示例中的 for 循环在这样使用时是一个真正的性能杀手
如果您想要更高的性能,只需执行以下操作:
(我不会说这是最好的性能,但肯定会更好)
def hsv_to_rgb(h, s, v):
if s == 0.0: v*=255; return (v, v, v)
i = int(h*6.) # XXX assume int() truncates!
f = (h*6.)-i; p,q,t = int(255*(v*(1.-s))), int(255*(v*(1.-s*f))), int(255*(v*(1.-s*(1.-f)))); v*=255; i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
^ 这保证 int() 输出范围为 255(输入仍然相同)
>>> hsv_to_rgb(359./360.,1,1)
(255, 0, 0)
提示:尽可能远离第 3 方,尽可能尝试直接方法。
排除:编译的 C 扩展,如 PIL 或 NumPy,或 ctypes 包装器,如 PyOpenGL(使用 DLL)