Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么numpy矢量化不能提高代码的速度_Python 3.x_Numpy_Vectorization - Fatal编程技术网

Python 3.x 为什么numpy矢量化不能提高代码的速度

Python 3.x 为什么numpy矢量化不能提高代码的速度,python-3.x,numpy,vectorization,Python 3.x,Numpy,Vectorization,下面是不使用矢量化的原始代码 import tensorflow as tf import time from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data( path='mnist.npz' ) x_train = x_t

下面是不使用矢量化的原始代码

import tensorflow as tf
import time
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data(
    path='mnist.npz'
)

x_train = x_train.reshape(60000,-1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(x_train)
pca = PCA()
pca = PCA(n_components = 16) # or 12      ->       3, 4  filter_size=3
X_pca = pca.fit_transform(X_scaled).reshape(60000, 4, 4, 1)
start = time.time()
X_pca_zero = X_pca[0]
for i in range(1,60000):
    X_pca_expanded = X_pca[i]
    print(tf.image.ssim(X_pca_zero, X_pca_expanded, 255, filter_size=4))
print(time.time()-start)
它本质上是比较参考图像和一组图像之间的相似性。我觉得矢量化可以加快速度(从而避免for循环浪费时间)。因此,我使用了numpy矢量化函数-

import numpy as np
import tensorflow as tf
import time
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data(
    path='mnist.npz'
)
def my_func(x_train):
    x_train = x_train.reshape(60000,-1)
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(x_train)
    pca = PCA()
    pca = PCA(n_components = 16) # or 12      ->       3, 4  filter_size=3
    X_pca = pca.fit_transform(X_scaled).reshape(60000, 4, 4, 1)
    start = time.time()
    X_pca_zero = X_pca[0]
    for i in range(1,6000):
        X_pca_expanded = X_pca[i]
        print(tf.image.ssim(X_pca_zero, X_pca_expanded, 255, filter_size=4))
    print(time.time()-start)

    return 0
np.vectorize(my_func(x_train))

但是,速度似乎没有任何提高。

在Python函数调用中,参数在传递给函数之前进行求值
np.vectorize
是一个Python函数,它需要一个函数作为参数,并返回另一个函数

np.vectorize(my_func(x_train))
在将结果传递给
矢量化之前,运行
my\u func(x\u train)
。该参数计算完成所有打印和计时,并返回0。我怀疑它是否有效,但是:

In [194]: np.vectorize(0)
Out[194]: <numpy.vectorize at 0x7ff091c36310>
我不熟悉tf.image.ssim的功能。但它是一个张量流函数,可能很复杂。运行6000次肯定要花很多时间。如果它不允许您一次提供所有
X_pca
值(而不是一个接一个),那么您无法加快它的速度


我不知道它返回什么,但通常我们不在计时块中包含
打印。每次打印调用都会增加计算时间。

在Python函数调用中,参数在传递给函数之前会进行求值
np.vectorize
是一个Python函数,它需要一个函数作为参数,并返回另一个函数

np.vectorize(my_func(x_train))
在将结果传递给
矢量化之前,运行
my\u func(x\u train)
。该参数计算完成所有打印和计时,并返回0。我怀疑它是否有效,但是:

In [194]: np.vectorize(0)
Out[194]: <numpy.vectorize at 0x7ff091c36310>
我不熟悉tf.image.ssim的功能。但它是一个张量流函数,可能很复杂。运行6000次肯定要花很多时间。如果它不允许您一次提供所有
X_pca
值(而不是一个接一个),那么您无法加快它的速度


我不知道它返回什么,但通常我们不在计时块中包含
打印。每次打印调用都会增加计算时间。

来自
numpy
文档:“提供该函数主要是为了方便,而不是为了性能。该实现本质上是一个for循环。
numpy
文档中说:“提供该函数主要是为了方便,而不是为了性能。这个实现本质上是一个for循环。我的问题不太清楚。tf.ssim确实工作得很快。唯一的问题是for循环运行60000次。如果您看一下给ssim的参数,它将参考图像与60000个图像中的一个进行比较(这是并行化的完美候选)。我希望矢量化可以减少for循环所花费的时间。我们在
numpy
中所称的“矢量化”并不是同时在多台机器或多个内核上运行同一代码的“并行化”。有这样做的工具。Tensorflow甚至可能拥有它们(根据其“批处理”的概念)。感谢您的详细回答。我的问题不太清楚。tf.ssim确实工作得很快。唯一的问题是for循环运行60000次。如果您看一下给ssim的参数,它将参考图像与60000个图像中的一个进行比较(这是并行化的完美候选)。我希望矢量化可以减少for循环所花费的时间。我们在
numpy
中所称的“矢量化”并不是同时在多台机器或多个内核上运行同一代码的“并行化”。有这样做的工具。Tensorflow甚至可能拥有它们(根据其“批处理”的概念)。