Why is random number generator tf.random_uniform in tensorflow much faster than the numpy equivalent

  • A+
Category:Languages

The following code is what I used to test the performance:

import time import numpy as np import tensorflow as tf  t = time.time() for i in range(400):     a = np.random.uniform(0,1,(1000,2000)) print("np.random.uniform: {} seconds".format(time.time() - t))  t = time.time() for i in range(400):     a = np.random.random((1000,2000)) print("np.random.random:  {} seconds".format(time.time() - t))  t = time.time() for i in range(400):     a = tf.random_uniform((1000,2000),dtype=tf.float64); print("tf.random_uniform: {} seconds".format(time.time() - t)) 

All the three segments generate a uniformly random 1000*2000 matrix in double precision 400 times. The timing differences are striking. On my Mac,

np.random.uniform: 10.4318959713 seconds np.random.random:  8.76161003113 seconds tf.random_uniform: 1.21312117577 seconds 

Why is tensorflow much faster than numpy?

 


tf.random_uniform in this case is returning an unevaluated Tensor type, tensorflow.python.framework.ops.Tensor, and if you setup a session context in which to evaluate a in the tf.random_uniform case, you'll see that it takes a while too.

For example, here in the tf case I added sess.run (on a CPU-only machine), and it takes ~16 seconds to evaluate and materialize, which makes sense given some overhead to marshal into the numpy data type on output.

In [1]: %cpaste Pasting code; enter '--' alone on the line to stop or use Ctrl-D. :import time import numpy as np import tensorflow as tf  t = time.time() for i in range(400):     a = np.random.uniform(0,1,(1000,2000)) print("np.random.uniform: {} seconds".format(time.time() - t))  t = time.time() for i in range(400):     a = np.random.random((1000,2000)) print("np.random.random:  {} seconds".format(time.time() - t))  sess = tf.Session() t = time.time() for i in range(400):     a = sess.run(tf.random_uniform((1000,2000),dtype=tf.float64)) print("tf.random_uniform: {} seconds".format(time.time() - t)):::::::::::::::::: :-- np.random.uniform: 11.066569805145264 seconds np.random.random:  9.299575090408325 seconds 2018-10-29 18:34:58.612160: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations. 2018-10-29 18:34:58.612191: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations. 2018-10-29 18:34:58.612210: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. tf.random_uniform: 16.619441747665405 seconds 

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: