当数组是字符串时,为什么np.unique(array.tolist())比np.unique(数组)更快,而浮点数则相反?

piR*_*red 0 python numpy

考虑下面的数组和测试结果.
为什么tolist()当数组元素是字符串时运行速度更快而数组元素浮动时更快?

bunch_of_strings = pd.DataFrame(
    np.random.choice(list(ascii_letters), (10000, 4))).sum(1).values
bunch_of_floats = np.random.rand(10000)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

use*_*ica 6

你的bunch_of_strings数组有对象dtype,这意味着它没有NumPy的好处.它基本上只是一个更糟糕的列表,具有一堆特定于NumPy的开销和固定大小.

当你调用时tolist,np.unique必须将列表转换回数组.当它这样做时,它会生成一个dtype数组dtype('S4'),一个字符串dtype.非对象dtype的好处在np.unique通话中节省了大量时间,而不是额外转换中丢失的时间.

相比之下,bunch_of_floats有float64 dtype,而array-> list-> array转换不会改变它.这只是浪费时间.