Java Python2在简单的数学运算中表现不佳

Java Python2在简单的数学运算中表现不佳,java,python,performance,math,Java,Python,Performance,Math,我正在尝试对颜色量化从RGB值到16调色板的欧几里德距离做一个小的变化(我完全知道这不是欧几里德公式)。我对代码没有问题,但python的性能比Java慢25倍多 python中的Main方法如下所示: def getBaseColor(rValue=128, gValue=128, bValue=128): allDistances=[450]*16 for x in range(0,16): valoresColor = coloresWeb[x] allDistances[x]

我正在尝试对颜色量化从RGB值到16调色板的欧几里德距离做一个小的变化(我完全知道这不是欧几里德公式)。我对代码没有问题,但python的性能比Java慢25倍多

python中的Main方法如下所示:

def getBaseColor(rValue=128, gValue=128, bValue=128):
 allDistances=[450]*16
 for x in range(0,16):
  valoresColor = coloresWeb[x]
  allDistances[x]= (abs(valoresColor[0]-rValue) + abs(valoresColor[1]-gValue) + abs(valoresColor[2]-bValue))
 return allDistances.index(min(allDistances))
我做了一些小的基准测试(1M操作),Java比Python(2.7.9)快25倍。使用pypy帮助很大,但离Java还有很大的距离

Python 2:~5.2s

Java:~0.2s

派比:~0.6s

我的问题是: 我是不是在用python做错事,还是它天生就是超慢? 这是一个需要运行数亿次的过程,不,这不是图像处理(尽管看起来像)


为Python和Java提供了功能齐全的最小代码。使用NumPy,同时计算所有百万点:

import time
import numpy as np

webColours = np.array([
    [0,0,0],
    [0,0,128],
    [0,128,0],
    [0,128,128],
    [128,0,0],
    [128,0,128],
    [128,128,0],
    [192,192,192],
    [128,128,128],
    [0,0,255],
    [0,255,0],
    [0,255,255],
    [255,0,0],
    [255,0,255],
    [255,255,0],
    [255,255,255]
])

def getBaseColours(colours):
    # colours is 1000000x3
    # set up a distances array (16x1000000)
    distances = np.zeros((16, np.size(colours, 0)))
    for colour in xrange(16):
        # calculate distance of each input colour to this webColour
        distances[colour] = np.sum(abs(colours - webColours[colour]), 1)
    # which of 16 distances is the least for each of 1000000 colours
    return np.argmin(distances, 0)

startTime = time.time()
colour = np.array([134,234,43])
colours = np.tile(colour, (1000000, 1))
getBaseColours(colours)
print "Time: " + str(time.time()-startTime)

时间:在我的系统上为0.9秒(Python代码以9秒执行)。另外,我是NumPy的新手,因此可能代码可以进一步优化。

使用NumPy,同时计算所有百万点:

import time
import numpy as np

webColours = np.array([
    [0,0,0],
    [0,0,128],
    [0,128,0],
    [0,128,128],
    [128,0,0],
    [128,0,128],
    [128,128,0],
    [192,192,192],
    [128,128,128],
    [0,0,255],
    [0,255,0],
    [0,255,255],
    [255,0,0],
    [255,0,255],
    [255,255,0],
    [255,255,255]
])

def getBaseColours(colours):
    # colours is 1000000x3
    # set up a distances array (16x1000000)
    distances = np.zeros((16, np.size(colours, 0)))
    for colour in xrange(16):
        # calculate distance of each input colour to this webColour
        distances[colour] = np.sum(abs(colours - webColours[colour]), 1)
    # which of 16 distances is the least for each of 1000000 colours
    return np.argmin(distances, 0)

startTime = time.time()
colour = np.array([134,234,43])
colours = np.tile(colour, (1000000, 1))
getBaseColours(colours)
print "Time: " + str(time.time()-startTime)

时间:在我的系统上为0.9秒(Python代码以9秒执行)。另外,我是NumPy的新手,因此可能代码可以进一步优化。

使用NumPy,同时计算所有百万点:

import time
import numpy as np

webColours = np.array([
    [0,0,0],
    [0,0,128],
    [0,128,0],
    [0,128,128],
    [128,0,0],
    [128,0,128],
    [128,128,0],
    [192,192,192],
    [128,128,128],
    [0,0,255],
    [0,255,0],
    [0,255,255],
    [255,0,0],
    [255,0,255],
    [255,255,0],
    [255,255,255]
])

def getBaseColours(colours):
    # colours is 1000000x3
    # set up a distances array (16x1000000)
    distances = np.zeros((16, np.size(colours, 0)))
    for colour in xrange(16):
        # calculate distance of each input colour to this webColour
        distances[colour] = np.sum(abs(colours - webColours[colour]), 1)
    # which of 16 distances is the least for each of 1000000 colours
    return np.argmin(distances, 0)

startTime = time.time()
colour = np.array([134,234,43])
colours = np.tile(colour, (1000000, 1))
getBaseColours(colours)
print "Time: " + str(time.time()-startTime)

时间:在我的系统上为0.9秒(Python代码以9秒执行)。另外,我是NumPy的新手,因此可能代码可以进一步优化。

使用NumPy,同时计算所有百万点:

import time
import numpy as np

webColours = np.array([
    [0,0,0],
    [0,0,128],
    [0,128,0],
    [0,128,128],
    [128,0,0],
    [128,0,128],
    [128,128,0],
    [192,192,192],
    [128,128,128],
    [0,0,255],
    [0,255,0],
    [0,255,255],
    [255,0,0],
    [255,0,255],
    [255,255,0],
    [255,255,255]
])

def getBaseColours(colours):
    # colours is 1000000x3
    # set up a distances array (16x1000000)
    distances = np.zeros((16, np.size(colours, 0)))
    for colour in xrange(16):
        # calculate distance of each input colour to this webColour
        distances[colour] = np.sum(abs(colours - webColours[colour]), 1)
    # which of 16 distances is the least for each of 1000000 colours
    return np.argmin(distances, 0)

startTime = time.time()
colour = np.array([134,234,43])
colours = np.tile(colour, (1000000, 1))
getBaseColours(colours)
print "Time: " + str(time.time()-startTime)

时间:在我的系统上为0.9秒(Python代码以9秒执行)。另外,我是NumPy的新手,所以可能代码可以进一步优化。

因为你只想找到一个最近的邻居进行颜色量化,你实际上不需要按照你现在的方式计算所有的距离。特别是,在这种情况下使用a将更加有效


否则,正如其他人所指出的,Python的结果很慢,因为这样的操作通常不会在纯Python中执行。默认的方法是使用Numpy,在这种情况下,也可以使用Scipy中的专用函数来加速(在本例中,请参阅或更好)。最后,如果这还不够好,可以使用Cython、Pypy等。

因为您只想找到一个最近的邻居进行颜色量化,实际上不需要按照您的方式计算所有距离。特别是,在这种情况下使用a将更加有效


否则,正如其他人所指出的,Python的结果很慢,因为这样的操作通常不会在纯Python中执行。默认的方法是使用Numpy,在这种情况下,也可以使用Scipy中的专用函数来加速(在本例中,请参阅或更好)。最后,如果这还不够好,可以使用Cython、Pypy等。

因为您只想找到一个最近的邻居进行颜色量化,实际上不需要按照您的方式计算所有距离。特别是,在这种情况下使用a将更加有效


否则,正如其他人所指出的,Python的结果很慢,因为这样的操作通常不会在纯Python中执行。默认的方法是使用Numpy,在这种情况下,也可以使用Scipy中的专用函数来加速(在本例中,请参阅或更好)。最后,如果这还不够好,可以使用Cython、Pypy等。

因为您只想找到一个最近的邻居进行颜色量化,实际上不需要按照您的方式计算所有距离。特别是,在这种情况下使用a将更加有效



否则,正如其他人所指出的,Python的结果很慢,因为这样的操作通常不会在纯Python中执行。默认的方法是使用Numpy,在这种情况下,也可以使用Scipy中的专用函数来加速(在本例中,请参阅或更好)。最后,如果这还不够好,您可以使用Cython、Pypy等。

自然慢。我相信使用numpy可以大大加快速度。@e4c5我不明白。。。怎么样?对于(int i=0;i@nxgtrturbo对不起,误读了javacode@amadan很抱歉误读了java代码。您缺少的一件大事是Python使用动态查找的名称来完成所有工作(没有java中那样的编译时绑定),它的整数数学是任意精度的,使用包装器对象而不是机器原语。
numpy
可以将更多的工作转移到机器原语上,但更准确的比较是让Java使用
Java.math.biginger
完成所有工作;它可能仍然会稍微快一点,但不会快很多。见鬼,对于这一点ter,将
abs
缓存到本地名称可能会节省大量时间;将
\u abs=abs
添加到函数顶部;使用
\u abs
而不是
abs
。本质上很慢。我相信使用numpy可以大大加快速度。@e4c5我不明白它…这是怎么回事?为什么(int i=0;i@nxgtrturbo对不起,误读了javacode@amadan很抱歉误读了java代码。您缺少的一件大事是Python使用动态查找的名称来完成所有工作(没有java中那样的编译时绑定),它的整数数学是任意精度的,使用包装器对象而不是机器原语。
numpy
可以将更多的工作转移到机器原语上,但更准确的比较是让Java使用
Java.math.biginger
完成所有工作;它可能仍然会稍微快一点,但不会快很多。见鬼,对于这一点更重要的是,将
abs
缓存到本地名称可能会节省大量时间;将
\u abs=abs
添加到函数顶部;使用
\u abs
而不是
abs
。速度自然会变慢。我相信你也会