<commit_before>---
layout: post
title:  测量程序运行时间
category: 学习
tags:  程序
keywords: 运行时间
description: R和Python中测量程序运行时间的函数
---

最近在做模拟，而模拟结果的运行时间又太长，因而需要测试一下程序的运行时间，以便查看程序是否优化。

在R语言中，查看当前时间的函数为Sys.time()，此函数输出为日期-时间格式，Sys.Date()函数仅仅输出当前日期。

    Sys.time()
    [1] "2015-11-20 22:22:35 CST" #CST为当前时区缩写（中国标准时间）
    Sys.Date()
    [1] "2015-11-20"

既然可以得出当前的系统时间，那么一个简单的想法是，在程序运行之前得到一个系统时间，在运行结束后，得到一个系统时间，两者相减即可得到一个时间，这个时间可以视为程序运行时间，当然把这样的程序写在脚本文件里面，直接运行脚本文件是可以实现的。

但是这样的方法略显粗糙，有没有更细致的方法呢？有！通过查找，R语言中有一个proc.time()函数，这个函数可以输出三个时间，user(用户），systime(系统），elapse(流逝)，“用户”是消耗在应用程序（非操作系统部分）执行的时间，也就是程序的运行时间，“系统”是底层操作系统执行（例如磁盘读写等）部分的时间，“流逝”是经过的总时间（可以认为是前两者的总和）。一般优化时主要关注“用户”的时间。

以proc.time函数的自带示例为例：

    ptm <- proc.time() #查看当前各种时间
    for (i in 1:50) mad(stats::runif(500)) #运行的程序
    proc.time() - ptm #运行完后的各种时间与运行程序之前的各种时间之差
    user  system elapsed 
    0.01    0.00    0.02 

虽然这种方法比最初的方法精确了一些，但是，还是比较麻烦，需要前后时间相减，有没有既精细又方便的函数方法呢？其实，相比于proc.time（）方法，R更推荐使用system.time()方法来查看程序运行时间（a way to time an R expression: system.time is preferred）。

system.time()函数的使用方法很简单，将要运行的程序放到括号里就可以。查看此函数的原理，发现和上面的原理是一样的，不过是进行了包装而已，用起来更方便了。（system.time calls the function proc.time, evaluates expr, and then calls proc.time once more, returning the difference between the two proc.time calls.）

    require(stats)
    system.time(for(i in 1:100) mad(runif(1000)))
    user  system elapsed 
    0.05    0.00    0.05 

R语言中还有一个gc.time()函数，查看到目前为止，R在garbage collection 中所花费的时间。

计算程序运行时间在R语言中可以实现，在Python也能实现，实现的思路同R中一致，都是计算程序运行前后的时间，然后相减得到程序运行时间，仅仅是函数不同而已。

在python中有三个函数可以实现这个功能，分别是datetime中的datetime.now(),time中的time.time()和time.clock()。
    
    方法一：
    import datetime
    starttime = datetime.datetime.now() #返回当前的系统时间
    #run_fun()
    endtime = datetime.datetime.now()
    (endtime-starttime).seconds

    方法二：
    import time
    start = time.time() #返回相对于1970.1.1 00:00:00以秒计算的偏移量
    #run_fun()
    end = time.time()
    end - start
    
    方法三：
    start = time.clock()
    #run_fun()
    end = time.clock()
    end - start

time.clock函数在第一次调用的时候，返回的是程序运行的实际时间，之后的每次调用返回的是自第一次调用后,到这次调用的时间间隔。

这三个方法中，前两个包含了从程序开始到结束的所有时间，而第三个仅仅计算了程序运行的时间CPU时间，一般参考第三个。

##参考资料

【1】[R语言记录程序运行时间](http://www.cnblogs.com/emanlee/p/3861144.html)

【2】[R语言记录程序运行时间](http://bbs.pinggu.org/thread-1335822-1-1.html)

【3】[R-Sys.time计算程序运行时间](https://www.douban.com/note/309562343/?type=like)

【4】[python计算程序开始到程序结束的运行时间和程序运行的CPU时间](http://www.jb51.net/article/43897.htm)
<commit_msg>change<commit_after>---
layout: post
title:  测量程序运行时间
category: 学习
tags:  程序
keywords: 运行时间
description: R和Python中测量程序运行时间的函数
---

最近在做模拟，而模拟结果的运行时间又太长，因而需要测试一下程序的运行时间，以便查看程序是否优化。

在R语言中，查看当前时间的函数为Sys.time()，此函数输出为日期-时间格式，Sys.Date()函数仅仅输出当前日期。

    Sys.time()
    [1] "2015-11-20 22:22:35 CST" #CST为当前时区缩写（中国标准时间）
    Sys.Date()
    [1] "2015-11-20"

既然可以得出当前的系统时间，那么一个简单的想法是，在程序运行之前得到一个系统时间，在运行结束后，得到一个系统时间，两者相减即可得到一个时间，这个时间可以视为程序运行时间，当然把这样的程序写在脚本文件里面，直接运行脚本文件是可以实现的。

但是这样的方法略显粗糙，有没有更细致的方法呢？有！通过查找，R语言中有一个proc.time()函数，这个函数可以输出三个时间，user(用户），systime(系统），elapse(流逝)，“用户”是消耗在应用程序（非操作系统部分）执行的时间，也就是程序的运行时间，“系统”是底层操作系统执行（例如磁盘读写等）部分的时间，“流逝”是经过的总时间（可以认为是前两者的总和）。一般优化时主要关注“用户”的时间。

以proc.time函数的自带示例为例：

    ptm <- proc.time() #查看当前各种时间
    for (i in 1:50) mad(stats::runif(500)) #运行的程序
    proc.time() - ptm #运行完后的各种时间与运行程序之前的各种时间之差
    user  system elapsed 
    0.01    0.00    0.02 

虽然这种方法比最初的方法精确了一些，但是，还是比较麻烦，需要前后时间相减，有没有既精细又方便的函数方法呢？其实，相比于proc.time（）方法，R更推荐使用system.time()方法来查看程序运行时间（a way to time an R expression: system.time is preferred）。

system.time()函数的使用方法很简单，将要运行的程序放到括号里就可以。查看此函数的原理，发现和上面的原理是一样的，不过是进行了包装而已，用起来更方便了。（system.time calls the function proc.time, evaluates expr, and then calls proc.time once more, returning the difference between the two proc.time calls.）

    require(stats)
    system.time(for(i in 1:100) mad(runif(1000)))
    user  system elapsed 
    0.05    0.00    0.05 

R语言中还有一个gc.time()函数，查看到目前为止，R在garbage collection 中所花费的时间。

计算程序运行时间在R语言中可以实现，在Python也能实现，实现的思路同R中一致，都是计算程序运行前后的时间，然后相减得到程序运行时间，仅仅是函数不同而已。

在python中有三个函数可以实现这个功能，分别是datetime中的datetime.now(),time中的time.time()和time.clock()。
    
    方法一：
    import datetime
    starttime = datetime.datetime.now() #返回当前的系统时间
    #run_fun()
    endtime = datetime.datetime.now()
    (endtime-starttime).seconds

    方法二：
    import time
    start = time.time() #返回相对于1970.1.1 00:00:00以秒计算的偏移量
    #run_fun()
    end = time.time()
    end - start
    
    方法三：
    start = time.clock()
    #run_fun()
    end = time.clock()
    end - start

time.clock函数在第一次调用的时候，返回的是程序运行的实际时间，之后的每次调用返回的是自第一次调用后,到这次调用的时间间隔。

这三个方法中，前两个包含了从程序开始到结束的所有时间，而第三个仅仅计算了程序运行的CPU时间，一般参考第三个。

##参考资料

【1】[R语言记录程序运行时间](http://www.cnblogs.com/emanlee/p/3861144.html)

【2】[R语言记录程序运行时间](http://bbs.pinggu.org/thread-1335822-1-1.html)

【3】[R-Sys.time计算程序运行时间](https://www.douban.com/note/309562343/?type=like)

【4】[python计算程序开始到程序结束的运行时间和程序运行的CPU时间](http://www.jb51.net/article/43897.htm)

{'fraction_non_alphanumeric': 0.1330603889457523, 'fraction_numerical': 0.04257932446264074, 'mean_word_length': 5.099875156054932, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 6, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2472991', 'n_tokens_mistral': 3193, 'n_tokens_neox': 3356, 'n_words': 258}