啊啊啊啊啊吖

2018-11-09   阅读量: 654

数据分析师 Python数据分析 Python编程

三行Python代码让数据预处理速度变快

扫码加入数据分析学习群

Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现……

目前,大数据(Big Data)这个术语通常用于表示包含数十万数据点的数据集。在这样的尺度上,工作进程中加入任何额外的计算都需要时刻注意保持效率。在设计机器学习系统时,数据预处理非常重要——在这里,我们必须对所有数据点使用某种操作。

在默认情况下,Python 程序是单个进程,使用单 CPU 核心执行。而大多数当代机器学习硬件都至少搭载了双核处理器。这意味着如果没有进行优化,在数据预处理的时候会出现「一核有难九核围观」的情况——超过 50% 的算力都会被浪费。在当前四核处理器(英特尔酷睿 i5)和 6 核处理器(英特尔酷睿 i7)大行其道的时候,这种情况会变得更加明显。

标准方法让我们举一个简单的例子,在单个文件夹中有一个图片数据集,其中有数万张图片。在这里,我们决定使用 1000 张。我们希望在所有图片被传递到深度神经网络之前将其调整为 600×600 像素分辨率的形式。以下是你经常会在 GitHub 上看到的标准 Python 代码:

import glob

import os

import cv2





### Loop through all jpg files in the current folder

### Resize each one to size 600x600

for image_filename in glob.glob("*.jpg"):

### Read in the image data

img = cv2.imread(image_filename)



### Resize the image

img = cv2.resize(img, (600, 600))

上面的程序遵循你在处理数据脚本时经常看到的简单模式:

  • 首先从需要处理内容的文件(或其他数据)列表开始。
  • 使用 for 循环逐个处理每个数据,然后在每个循环迭代上运行预处理。

让我们在一个包含 1000 个 jpeg 文件的文件夹上测试这个程序,看看运行它需要多久:

time python standard_res_conversion.py

在我的酷睿 i7-8700k 6 核 CPU 上,运行时间为 7.9864 秒!在这样的高端 CPU 上,这种速度看起来是难以让人接受的,看看我们能做点什么。

更快的方法为了便于理解并行化的提升,假设我们需要执行相同的任务,比如将 1000 个钉子钉入木头,假如钉入一个需要一秒,一个人就需要 1000 秒来完成任务。四个人组队就只需要 250 秒。

在我们这个包含 1000 个图像的例子中,可以让 Python 做类似的工作:

  • 将 jpeg 文件列表分成 4 个小组;
  • 运行 Python 解释器中的 4 个独立实例;
  • 让 Python 的每个实例处理 4 个数据小组中的一个;
  • 结合四个处理过程得到的结果得出最终结果列表。

这一方法的重点在于,Python 帮我们处理了所有棘手的工作。我们只需告诉它我们想要运行哪个函数,要用多少 Python 实例,剩下的就交给它了!只需改变三行代码。实例:

import glob

import os

import cv2

import concurrent.futures





def load_and_resize(image_filename):

### Read in the image data

img = cv2.imread(image_filename)



### Resize the image

img = cv2.resize(img, (600, 600))





### Create a pool of processes. By default, one is created for each CPU in your machine.

with concurrent.futures.ProcessPoolExecutor() as executor:

### Get a list of files to process

image_files = glob.glob("*.jpg")



### Process the list of files, but split the work across the process pool to use all CPUs

### Loop through all jpg files in the current folder

### Resize each one to size 600x600

executor.map(load_and_resize, image_files)

with concurrent.futures.ProcessPoolExecutor() as executor:

你的 CPU 核越多,启动的 Python 进程越多,我的 CPU 有 6 个核。实际处理代码如下:executor.map(load_and_resize, image_files)

添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
0.0000 0 2 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子