我很好奇它使用

np.empty而不是

np.zeros实际上有多大差异,还有关于

np.ones的差异.我运行这个小脚本来测试每个创建一个大型数组所需的时间:

import numpy as np

from timeit import timeit

N = 10_000_000

dtypes = [np.int8, np.int16, np.int32, np.int64,

np.uint8, np.uint16, np.uint32, np.uint64,

np.float16, np.float32, np.float64]

rep= 100

print(f'{"DType":8s} {"Empty":>10s} {"Zeros":>10s} {"Ones":>10s}')

for dtype in dtypes:

name = dtype.__name__

time_empty = timeit(lambda: np.empty(N, dtype=dtype), number=rep) / rep

time_zeros = timeit(lambda: np.zeros(N, dtype=dtype), number=rep) / rep

time_ones = timeit(lambda: np.ones(N, dtype=dtype), number=rep) / rep

print(f'{name:8s} {time_empty:10.2e} {time_zeros:10.2e} {time_ones:10.2e}')

并获得下表:

DType Empty Zeros Ones

int8 1.39e-04 1.76e-04 5.27e-03

int16 3.72e-04 3.59e-04 1.09e-02

int32 5.85e-04 5.81e-04 2.16e-02

int64 1.28e-03 1.13e-03 3.98e-02

uint8 1.66e-04 1.62e-04 5.22e-03

uint16 2.79e-04 2.82e-04 9.49e-03

uint32 5.65e-04 5.20e-04 1.99e-02

uint64 1.16e-03 1.24e-03 4.18e-02

float16 3.21e-04 2.95e-04 1.06e-02

float32 6.31e-04 6.06e-04 2.32e-02

float64 1.18e-03 1.16e-03 4.85e-02

从中我提取了两个有些令人惊讶的结论:

> np.empty和np.zeros的性能几乎没有区别,可能除了int8的一些差异.我不明白为什么会这样.创建一个空数组应该更快,实际上我已经看到了这个的报告(例如Speed of np.empty vs np.zeros).

> np.zeros和np.ones之间有很大的不同.我怀疑这与内存归零的高性能方法有关,不适用于用常量填充内存区域,但我真的不知道如何或在什么级别这样可行.

这些结果的解释是什么?

我在Windows 10(使用MKL)上使用NumPy 1.15.4和Python 3.6 Anaconda,我有一个Intel Core i7-7700K CPU.

编辑:根据评论中的建议,我尝试运行基准交错每个单独的试验和最后的平均,但我看不出结果的显着差异.但是,在相关的说明中,我不知道NumPy中是否有任何机制可以重用刚刚删除的数组的内存,这会使这些措施变得不切实际(尽管时间似乎与数据类型大小相关)对于空数组).

最佳答案 这应该是一个评论,但它不适合.这是脚本的一个小扩展.有一些“手工制作”的零和一个版本.

import numpy as np

from timeit import timeit

N = 10_000_000

dtypes = [np.int8, np.int16, np.int32, np.int64,

np.uint8, np.uint16, np.uint32, np.uint64,

np.float16, np.float32, np.float64]

rep= 100

print(f'{"DType":8s} {"Empty":>10s} {"Zeros":>10s} {"Ones":>10s}')

for dtype in dtypes:

name = dtype.__name__

time_empty = timeit(lambda: np.empty(N, dtype=dtype), number=rep) / rep

time_zeros = timeit(lambda: np.zeros(N, dtype=dtype), number=rep) / rep

time_ones = timeit(lambda: np.ones(N, dtype=dtype), number=rep) / rep

time_full_zeros = timeit(lambda: np.full(N, 0, dtype=dtype), number=rep) / rep

time_full_ones = timeit(lambda: np.full(N, 1, dtype=dtype), number=rep) / rep

time_empty_zeros = timeit(lambda: np.copyto(np.empty(N, dtype=dtype), 0), number=rep) / rep

time_empty_ones = timeit(lambda: np.copyto(np.empty(N, dtype=dtype), 1), number=rep) / rep

print(f'{name:8s} {time_empty:10.2e} {time_zeros:10.2e} {time_ones:10.2e} {time_full_zeros:10.2e} {time_full_ones:10.2e} {time_empty_zeros:10.2e} {time_empty_ones:10.2e} ')

时间是暗示性的.

DType Empty Zeros Ones

int8 1.37e-06 6.33e-04 5.73e-04 5.76e-04 5.73e-04 6.05e-04 5.82e-04

int16 1.61e-06 1.55e-03 3.54e-03 3.54e-03 3.56e-03 3.54e-03 3.54e-03

int32 7.22e-06 6.99e-06 1.24e-02 1.20e-02 1.25e-02 1.19e-02 1.21e-02

int64 8.26e-06 8.06e-06 2.62e-02 2.64e-02 2.61e-02 2.62e-02 2.62e-02

uint8 1.32e-06 6.30e-04 5.85e-04 5.86e-04 5.77e-04 5.70e-04 5.83e-04

uint16 1.32e-06 1.63e-03 3.61e-03 3.65e-03 4.08e-03 4.08e-03 3.58e-03

uint32 7.08e-06 7.20e-06 1.48e-02 1.41e-02 1.63e-02 1.44e-02 1.32e-02

uint64 7.14e-06 7.13e-06 2.69e-02 2.67e-02 2.82e-02 2.68e-02 2.72e-02

float16 1.31e-06 1.55e-03 3.56e-03 3.79e-03 3.54e-03 3.53e-03 3.55e-03

float32 7.11e-06 6.95e-06 1.36e-02 1.35e-02 1.37e-02 1.35e-02 1.37e-02

float64 7.27e-06 7.33e-06 3.13e-02 3.00e-02 2.75e-02 2.80e-02 2.75e-02

重新零比我似乎记得的更快,正如评论中所建议的那样,零确实使用了calloc,它是一个系统例程,其唯一目的是分配零块,这可能是很好的.

python中np没有定义_python中的np.empty_python – np.empty,np.zeros和np.one相关推荐

  1. python中对象的定义_python中对象的定义和使用

    python中对象的定义和使用 发布时间:2020-06-22 11:57:16 来源:亿速云 阅读:98 作者:Leah 今天就跟大家聊聊有关python中对象的定义和使用,可能很多人都不太了解,为 ...

  2. python私有属性怎么定义_Python中私有属性的定义方式

    Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...

  3. python中变量怎么定义_python中的变量的使用定义以及使用规则

    本篇包括14章内容,系统介绍了Python语言的基础知识.内容包括Python基础语法.数据类型和类型转换.运算符.流程控制(分支结构循环结构).数据结构(列表生成式).函数的定义及使用.异常处理.迭 ...

  4. python私有属性怎么定义_Python中定义私有属性的方法是()。

    [判断题]请假条带有请求的性质,所以一般来说篇幅要尽量长一些,以示郑重;更多要用煽情性语句,以打动对方.( ) [单选题]关于类和对象的关系,下列描述正确的是(). [选择]Трудоспособны ...

  5. python中name没有定义_python中__name__的使用

    这几天开始学习Python,遇到一些问题,也解决了一些问题. 其中if __name__ == '__main__':这句估计很多和我一样的初学者都是不求甚解.这里作一下解释: 1:__name__是 ...

  6. python工具用什么语言_Python中一些自然语言工具的使用的入门教程

    NLTK 是使用 Python 教学以及实践计算语言学的极好工具.此外,计算语言学与人工 智能.语言/专门语言识别.翻译以及语法检查等领域关系密切. NLTK 包括什么 NLTK 会被自然地看作是具有 ...

  7. python基于训练集预测_Python中训练集/测试集的分割和交叉验证

    原标题:Python中训练集/测试集的分割和交叉验证 嗨,大家好!在上一篇关于Python线性回归的文章之后,我认为撰写关于切分训练集/测试集和交叉验证的文章是很自然的,和往常一样,我将对该主题进行简 ...

  8. python find的使用方法_Python中的rfind()方法使用详解

    Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...

  9. python中array的用法_Python中的numpy.array()用法

    齐次多维数组是NumPy的主要对象.它基本上是一个元素表, 这些元素都是相同类型的, 并由一个正整数元组索引.尺寸在NumPy中称为轴. NumPy的数组类称为ndarray或别名数组. numpy. ...

最新文章

  1. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...
  2. IQKeyboardManager使用方法
  3. android 53 ContentProvider内容提供者
  4. 《Spark大数据分析:核心概念、技术及实践》大数据技术一览
  5. 【 MATLAB 】通过不同样本数的同一个有限长序列作 DTFT 对比
  6. mysql 多实例应用配置部署指南
  7. Spring定时任务注解@Scheduled+@EnableAsync用法详解(简单说明+应用场景+demo源代码+执行过程分析)
  8. Ubuntu Server搭建FTP服务器(2) --本地用户FTP服务器架设
  9. Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境
  10. 无向图的邻接表表示法 及 深搜遍历DFS
  11. Android异常总结---1.Android java.net.SocketException: Address family not supported by protocol
  12. 利用NSFileManager获取文件(文件夹)列表
  13. html微信朋友圈demo,Vue.js实现模拟微信朋友圈开发demo
  14. 揭晓eval(function(p,a,c,k,e,r)js代码解密加密程序
  15. opencv 白平衡之灰度世界算法
  16. 少儿编程网站源码和scratch课程
  17. IC验证之测试点分解
  18. JavaWeb_04_MySQL多表事务
  19. 一款开源且具有交互视图界面的实时 Web 日志分析工具
  20. 有关路基和隧道的CASIO 5800P 万能曲线 计算程序

热门文章

  1. 茶百科 android 论文,基于android平台手机茶百科开发_学位论文.doc
  2. php 代码符号,网站开发编程中的特殊符号处理_php
  3. 校招萌新在阿里妈妈是如何成长的
  4. numpy 最大值_使用 NumPy 让你的 Python 科学计算更高效
  5. 高中生计算机专业的研究论文,高中计算机个性化教学模式研究的论文
  6. windows Perl环境安装与Hello World
  7. 使左对角线和右对角线上的元素为0
  8. 鸿蒙概念爆发,叶子看盘:华为鸿蒙概念爆发,这两只龙头已启动!
  9. 【图像超分辨率】SR for RS via Local–Global Combined Network
  10. 数组输出黑科技----fwrite()