python微秒
A. 如何在python中比较微秒时间差
python中的最小时间单位是毫秒,没办法精确到微秒
用time包的time()函数可以获得当前计算机的挂钟时间,利用它可以获得时间差
import time
time1 = time.time()
#要度量时间的程序
time2 = time.time()
print time2 - time1
B. 如何让 Python 像 Julia 一样快地运行
使用 Cython 编译
一种编译方式是使用 Cython 编译器。这个编译器是使用 Python
编写的。它可以通过以下命令安装:
pip install Cython
如果使用 Anaconda,安装会有所不同。因为安装有点复杂,所以我编写了一篇相关的博客文章:将 Cython For Anaconda 安装在 Windows 上
安装后,我们使用神奇的 %load_ext 将 Cython 加载到 Notebook 中:
%load_ext Cython
然后就可以在我们的 Notebook 中编译代码。我们只需要将想要编译的代码放在一个单元中,包括所需的导入语句,使用神奇的 %%cython 启动该单元:
%%cython
def fib_cython(n):
if n<2:
return n
return fib_cython(n-1)+fib_cython(n-2)
执行该单元会无缝地编译这段代码。我们为该函数使用一个稍微不同的名称,以反映出它是使用 Cython
编译的。当然,一般不需要这么做。我们可以将之前的函数替换为相同名称的已编译函数。
对它计时会得到:
1000 loops, best of 3:1.22 ms per loop
哇,几乎比最初的 Python 代码快 3 倍!我们现在比使用 BigInt 的 Julia 快 100 倍。
我们还可以尝试静态类型。使用关键字 cpdef 而不是 def 来声明该函数。它使我们能够使用相应的 C 类型来键入函数的参数。我们的代码变成了:
%%cython
cpdef long fib_cython_type(long n):
if n<2:
return n
return fib_cython_type(n-1)+fib_cython_type(n-2)
执行该单元后,对它计时会得到:
10000 loops, best of 3:36 µs per loop
太棒了,我们现在只花费了 36 微秒,比最初的基准测试快约 100 倍!这与 Julia 所花的 80 毫秒相比更出色。
有人可能会说,静态类型违背了 Python
的用途。一般来讲,我比较同意这种说法,我们稍后将查看一种在不牺牲性能的情况下避免这种情形的方法。但我并不认为这是一个问题。Fibonacci
函数必须使用整数来调用。我们在静态类型中失去的是 Python 所提供的任意精度。对于 Fibonacci,使用 C 类型 long
会限制输入参数的大小,因为太大的参数会导致整数溢出。
请注意,Julia 计算也是使用 64 位整数执行的,因此将我们的静态类型版本与 Julia 的对比是公平的。
回页首
缓存计算
我们在保留 Python 任意精度的情况下能做得更好。fib 函数重复执行同一种计算许多次。例如,fib(20) 将调用 fib(19) 和
fib(18)。fib(19) 将调用 fib(18) 和 fib(17)。结果 fib(18) 被调用了两次。简单分析表明,fib(17) 将被调用 3
次,fib(16) 将被调用 5 次,等等。
在 Python 3 中,我们可以使用 functools 标准库来避免这些重复的计算。
from functools import lru_cache as cache
@cache(maxsize=None)
def fib_cache(n):
if n<2:
return n
return fib_cache(n-1)+fib_cache(n-2)
对此函数计时会得到:
1000000 loops, best of 3:910 ns per loop
速度又增加了 40 倍,比最初的 Python 代码快约 3,600 倍!考虑到我们仅向递归函数添加了一条注释,此结果非常令人难忘。
Python 2.7 中没有提供这种自动缓存。我们需要显式地转换代码,才能避免这种情况下的重复计算。
def fib_seq(n):
if n < 2:
return n
a,b = 1,0
for i in range(n-1):
a,b = a+b,a
return a
请注意,此代码使用了 Python 同时分配两个局部变量的能力。对它计时会得到:
1000000 loops, best of 3:1.77 µs per loop
我们又快了 20 倍!让我们在使用和不使用静态类型的情况下编译我们的函数。请注意,我们使用了 cdef 关键字来键入局部变量。
%%cython
def fib_seq_cython(n):
if n < 2:
return n
a,b = 1,0
for i in range(n-1):
a,b = a+b,a
return a
cpdef long fib_seq_cython_type(long n):
if n < 2:
return n
cdef long a,b
a,b = 1,0
for i in range(n-1):
a,b = a+b,b
return a
我们可在一个单元中对两个版本计时:
%timeit fib_seq_cython(20)
%timeit fib_seq_cython_type(20)
结果为:
1000000 loops, best of 3:953 ns per loop
10000000 loops, best of 3:51.9 ns per loop
静态类型代码现在花费的时间为 51.9 纳秒,比最初的基准测试快约 60,000(六万)倍。
如果我们想计算任意输入的 Fibonacci 数,我们应坚持使用无类型版本,该版本的运行速度快 3,500 倍。还不错,对吧?
回页首
使用 Numba 编译
让我们使用另一个名为 Numba 的工具。它是针对部分 Python 版本的一个即时
(jit) 编译器。它不是对所有 Python 版本都适用,但在适用的情况下,它会带来奇迹。
安装它可能很麻烦。推荐使用像 Anaconda 这样的 Python 发行版或一个已安装了 Numba 的 Docker 镜像。完成安装后,我们导入它的 jit 编译器:
from numba import jit
它的使用非常简单。我们仅需要向想要编译的函数添加一点修饰。我们的代码变成了:
@jit
def fib_seq_numba(n):
if n < 2:
return n
(a,b) = (1,0)
for i in range(n-1):
(a,b) = (a+b,a)
return a
对它计时会得到:
1000000 loops, best of 3:225 ns per loop
比无类型的 Cython 代码更快,比最初的 Python 代码快约 16,000 倍!
回页首
使用 Numpy
我们现在来看看第二项基准测试。它是快速排序算法的实现。Julia 团队使用了以下 Python 代码:
def qsort_kernel(a, lo, hi):
i = lo
j = hi
while i < hi:
pivot = a[(lo+hi) // 2]
while i <= j:
while a[i] < pivot:
i += 1
while a[j] > pivot:
j -= 1
if i <= j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
if lo < j:
qsort_kernel(a, lo, j)
lo = i
j = hi
return a
我将他们的基准测试代码包装在一个函数中:
import random
def benchmark_qsort():
lst = [ random.random() for i in range(1,5000) ]
qsort_kernel(lst, 0, len(lst)-1)
对它计时会得到:
100 loops, best of 3:18.3 ms per loop
上述代码与 C 代码非常相似。Cython 应该能很好地处理它。除了使用 Cython 和静态类型之外,让我们使用 Numpy
数组代替列表。在数组大小较大时,比如数千个或更多元素,Numpy 数组确实比
Python 列表更快。
安装 Numpy 可能会花一些时间,推荐使用 Anaconda 或一个已安装了 Python 科学工具组合的 Docker 镜像。
在使用 Cython 时,需要将 Numpy 导入到应用了 Cython 的单元中。在使用 C 类型时,还必须使用 cimport 将它作为 C 模块导入。Numpy
数组使用一种表示数组元素类型和数组维数(一维、二维等)的特殊语法来声明。
%%cython
import numpy as np
cimport numpy as np
cpdef np.ndarray[double, ndim=1] \
qsort_kernel_cython_numpy_type(np.ndarray[double, ndim=1] a, \
long lo, \
long hi):
cdef:
long i, j
double pivot
i = lo
j = hi
while i < hi:
pivot = a[(lo+hi) // 2]
while i <= j:
while a[i] < pivot:
i += 1
while a[j] > pivot:
j -= 1
if i <= j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
if lo < j:
qsort_kernel_cython_numpy_type(a, lo, j)
lo = i
j = hi
return a
cpdef benchmark_qsort_numpy_cython():
lst = np.random.rand(5000)
qsort_kernel_cython_numpy_type(lst, 0, len(lst)-1)
对 benchmark_qsort_numpy_cython() 函数计时会得到:
1000 loops, best of 3:1.32 ms per loop
我们比最初的基准测试快了约 15 倍,但这仍然不是使用 Python 的最佳方法。最佳方法是使用 Numpy 内置的 sort()
函数。它的默认行为是使用快速排序算法。对此代码计时:
def benchmark_sort_numpy():
lst = np.random.rand(5000)
np.sort(lst)
会得到:
1000 loops, best of 3:350 µs per loop
我们现在比最初的基准测试快 52 倍!Julia 在该基准测试上花费了 419 微秒,因此编译的 Python 快 20%。
我知道,一些读者会说我不会进行同类比较。我不同意。请记住,我们现在的任务是使用主机语言以最佳的方式排序输入数组。在这种情况下,最佳方法是使用一个内置的函数。
C. Python能不能产生微秒级别的时间戳
time.time()就可以, 乘1000就行了
>>>importtime
>>>time.time()
1509890332.4617682
D. python如何微秒级延时
python中的最小时间单位是毫秒,没办法精确到微秒
用time包的time()函数可以获得当前计算机的挂钟时间,利用它可以获得时间差
import time
time1 = time.time()
#要度量时间的程序
time2 = time.time()
print time2 - time1
E. python获取时间模块关于毫秒的求解。
通过查阅文档这一项表示的是microsecond
通过查字典microsecond表示微秒,不是毫秒,1秒=100万微秒
F. python中两个时间戳相减得到结果是不是秒数
是的。
python中的时间戳相减是微秒数,也就是千分之一秒。
时间戳字段在MySQL中经常使用到,比如需要记录一行数据创建的时间或修改的时间时,我们通常会使用时间戳即timestamp字段。
timestamp字段类型可存储时间类型数据,timestamp所能存储的时间范围为:'1970-01-0100:00:01.000000'到'2038-01-1903:14:07.999999'。
timestamp字段占用4个字节。在MySQL5.7版本,timestamp可以指定精度,即TIMESTAMP(fsp)中fsp可以指定一个介于0到6之间的可选值,以代表小数秒精度。值为0表示没有小数部分,如果省略,则默认精度为0。
(6)python微秒扩展阅读:
影响时间戳显示的参数主要有两个,分别是explicitdefaultsfortimestamp,timezone。
explicitdefaultsfor_timestamp参数决定MySQL服务端对timestamp列中的默认值和`NULL`值的不同处理方法。此变量自MySQL5.6.6版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。
在默认情况下,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的)。
如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
G. python时间可不可以精确到微秒
是可以的,python的time模块中时间秒数小数位数很多,精度很高。
H. python date,datetime 和time的区别
这是三个不同类型的数据,例如 2015-11-21 10:51:20:
date是日期,表示的是 2015-11-21;
datetime是日期时间,表示的是 2015-11-21 10:51:20;
time是时间,表示的是 10:51:20。
I. python如何获取数据刷新率毫秒
转换time.time()函数返回的时间浮点数,来获取当前毫秒时间。
先importtime模块。getMS函数的返回值,就是一个长度为3的毫秒时间字符串,getTime函数将这个毫秒时间与小时分钟秒合并成一个用冒号(:)分割的时间字符串。
秒,毫秒,微秒相互之间都是10^3的关系,以上代码将时间转换成微秒代码,然后用1000去取余,就得到了当前时间的微秒值。这段代码得到的是int,请按自己需要转换成string。
J. python 计算时间差秒
python 计算时间差秒:
上例演示了计算当前时间向后10小时的时间。