带你入门比Python更高效的Numpy(附代码)

简介: 数据科学家介绍了向量化技巧,简单的数学变化可以通过可迭代对象执行。

简介

向量化技巧对于数据科学家来说是相当熟知的,并且常用于编程中,以加速整体数据转换,其中简单的数学变化通过可迭代对象(例如列表)执行。未受到重视的是,把有一定规模的代码模块,如条件循环,进行矢量化,也能带来一些好处。
正文

Python正在迅速成为数据科学家的编程实战语言。但与R或Julia不同的是,它是通用型编程语言,没有功能语法来立即开始分析和转换数值数据。所以,它需要专门的库。

Numpy是Numerical Python的缩写,是Python生态系统中高性能科学计算和数据分析所需的基础软件包。它是几乎所有高级工具(如Pandas和scikit-learn)的基础。

TensorFlow使用NumPy数组作为基础构建模块,在这些模块的基础上,他们为深度学习任务(在长列表/向量/数字矩阵上大量使用线性代数运算)构建了张量对象(Tensor objects)和图形流(graphflow)许多Numpy操作都是用C语言实现的,避免了Python中循环的基本代价,即指针间接寻址和每个元素的动态类型检查。速度的提升取决于您正在执行的操作。对于数据科学和现代机器学习的任务来说,这是一个非常宝贵的优势。

我最近一篇文章讲了使用Numpy向量化简单数据转换任务的优势,它引起了一些联想,并受到读者的欢迎。关于代码简化等矢量化的效用,也有一些有趣的讨论。

现在,基于某些预定义条件的数学转换在数据科学任务中相当普遍。事实证明,通过首先转换为函数然后使用numpy.vectorize方法,可以轻松地对条件循环的简单模块进行矢量化。在我之前的文章中,我展示了Numpy矢量化简单数学变换后一个数量级的速度提升。对于目前的情况来说,由于内部条件循环仍然效率低下,速度提升并不那么显着。但是,与其他纯粹Python代码相比,执行时间至少要提高20-50%。

以下是演示它的简单代码:

import numpy as np
from math import sin as sn
import matplotlib.pyplot as plt
import time
 
# 测试数量
N_point = 1000
 
# 定义一个有if else循环的函数
def myfunc(x,y):
  if (x>0.5*y and y<0.3): return (sn(x-y))
  elif (x<0.5*y): return 0
  elif (x>0.2*y): return (2*sn(x+2*y))
  else: return (sn(y+x))
 
# 从正态分布产生存储元素的列表
lst_x = np.random.randn(N_point)
lst_y = np.random.randn(N_point)
lst_result = []
 
# 可选择画出数据分布
plt.hist(lst_x,bins=20)

plt.show()
plt.hist(lst_y,bins=20)
plt.show()
 
# 首先,纯粹的Python代码
t1=time.time()
First, plain vanilla for-loop
t1=time.time()
for i in range(len(lst_x)):
    x = lst_x[i]
    y= lst_y[i]
    if (x>0.5*y and y<0.3):
        lst_result.append(sn(x-y))
    elif (x<0.5*y):
        lst_result.append(0)
    elif (x>0.2*y):
        lst_result.append(2*sn(x+2*y))
    else:
        lst_result.append(sn(y+x))
t2=time.time()
 
print("\nTime taken by the plain vanilla for-loop\n----------------------------------------------\n{} us".format(1000000*(t2-t1)))
 
# List comprehension
print("\nTime taken by list comprehension and zip\n"+'-'*40)
%timeit lst_result = [myfunc(x,y) for x,y in zip(lst_x,lst_y)]
 
# Map() 函数
print("\nTime taken by map function\n"+'-'*40)
%timeit list(map(myfunc,lst_x,lst_y))
 
# Numpy.vectorize 方法
print("\nTime taken by numpy.vectorize method\n"+'-'*40)
vectfunc = np.vectorize(myfunc,otypes=[np.float],cache=False)
%timeit list(vectfunc(lst_x,lst_y))
 
# 结果
Time taken by the plain vanilla for-loop
----------------------------------------------
2000.0934600830078 us
 
Time taken by list comprehension and zip
----------------------------------------
1000 loops, best of 3: 810 µs per loop
 
Time taken by map function
----------------------------------------
1000 loops, best of 3: 726 µs per loop
 
Time taken by numpy.vectorize method
----------------------------------------

1000 loops, best of 3: 516 µs per

请注意,我已经在任何可以把表达式用一行语句来实现的地方使用了%timeit Jupyter魔术命令。这样我就可以有效运行超过1000个相同表达式的循环,来计算平均执行时间以避免任何随机效应。因此,如果您在Jupyter Notebook中运行整个脚本,则可能会出现与第一种情况(即普通循环执行)略有不同的结果,但接下来的三种应该会给出非常一致的趋势(基于您的计算机硬件)。

我们看到的证据表明,对于基于一系列条件检查的数据转换任务,与一般Python方法相比,使用Numpy的向量化方法通常会使速度提高20-50%。

这貌似不是一个显著改进,但节省的每一点时间都可以加入数据科学工作流程中,从长远来看是值得的!如果数据科学工作要求这种转换发生一百万次,那么可能会导致短则八小时,长则两天的差异。

简而言之,任何时候你有长的数据列表并需要对它们进行数学转换,都应强烈考虑将这些Python数据结构(列表或元组或字典)转换为numpy.ndarray对象并使用自带的向量化功能。

Numpy提供了一个用于更快代码执行的C应用程序接口(C-API),但是它失去了Python编程的简单性。这个Scipy讲义能告诉你在这方面的所有相关选项。

原文发布时间为:2018-07-16
本文作者:TIRTHAJYOTI SARKAR
本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU

相关文章
|
6天前
|
Web App开发 数据采集 前端开发
基于Python的Selenium详解:从入门到实践
基于Python的Selenium详解:从入门到实践
|
9天前
|
机器学习/深度学习 数据挖掘 数据库
从入门到精通:如何成为一名优秀的Python工程师
Python语言近年来在技术领域中越来越受到重视,成为了许多公司招聘的热门技能之一。本文将介绍如何成为一名优秀的Python工程师,从基础知识的学习到实践项目的经验总结,帮助你走上成功的道路。
24 0
|
6天前
|
机器学习/深度学习 数据可视化 数据挖掘
Python数据分析:从入门到实践
Python数据分析:从入门到实践
|
6天前
|
数据采集 存储 数据可视化
Python数据分析从入门到实践
Python数据分析从入门到实践
|
4天前
|
存储 数据处理 开发者
从入门到精通:Python中的常用数据结构
Python是一种广泛使用的高级编程语言,其简洁明了的语法和强大的数据处理能力使得它成为了众多开发者的首选。本文将深入探讨Python中的常用数据结构,包括列表、元组、字典和集合,并介绍它们的应用场景,帮助读者更好地理解并掌握这些基础的数据结构。
|
6天前
|
机器学习/深度学习 IDE 开发工具
Python入门指南
Python入门指南
|
6天前
|
数据可视化 API 开发者
Python中的图形界面开发:Tkinter、PyQt或wxPython入门
Python中的图形界面开发:Tkinter、PyQt或wxPython入门
|
6天前
|
机器学习/深度学习 数据采集 算法
Python中的机器学习入门:从数据预处理到模型评估
Python中的机器学习入门:从数据预处理到模型评估
|
21天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习入门:Python 与神经网络
深度学习是机器学习的一个分支,它涉及使用多层神经网络来处理和学习数据。在 Python 中,有许多流行的深度学习库和框架可以帮助我们轻松地构建和训练神经网络模型。在本文中,我们将介绍深度学习的基本概念,并使用 Python 中的 TensorFlow 和 Keras 库来构建一个简单的神经网络模型。
|
23天前
|
机器学习/深度学习 数据挖掘 程序员
深入理解Python协程:提升并发编程效率基于Python的机器学习入门:从理论到实践
本文旨在探讨Python协程(Coroutine)的内部机制及其在并发编程中的应用。区别于传统的线程和进程,协程提供了一种更轻量级、高效的并发编程模式。通过深入分析协程的工作原理,本文将展示如何利用协程优化程序性能,实现高效的异步任务处理。我们将通过实例探讨协程的创建、事件循环的管理、以及与异步IO的集成,为读者提供一套完整的协程应用方案。此外,本文还将对比协程与其他并发模型(如多线程和多进程)的优劣,帮助读者全面理解协程在现代编程中的重要性。 在本文中,我们将深入探讨机器学习的核心概念,并通过Python实现其基础应用。不同于传统的技术文章摘要,我们希望通过一个故事性的引入,让读者感受到