先上一个例子,这段代码是为了评估一个预测模型写的,详细评价说明在

https://www.kaggle.com/c/how-much-did-it-rain/details/evaluation,

它的核心是要计算

在实际计算过程中,n很大(1126694),以至于单进程直接计算时间消耗巨大(14分10秒),

所以这里参考mapReduce的思想,尝试使用多进程的方式进行计算,即每个进程计算一部分n,最后将结果相加再计算C

代码如下:

import csv
import sys
import logging
import argparse
import numpy as np
import multiprocessing
import time # configure logging
logger = logging.getLogger("example") handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s %(name)s: %(message)s')) logger.addHandler(handler)
logger.setLevel(logging.DEBUG) def H(n, z):
return (n-z) >= 0 def evaluate(args, start, end):
'''handle range[start, end)'''
logger.info("Started %d to %d" %(start, end))
expReader = open('train_exp.csv','r')
expReader.readline()
for i in range(start):
_ = expReader.readline()
predFile = open(args.predict)
for i in range(start+1):
_ = predFile.readline()
predReader = csv.reader(predFile, delimiter=',')
squareErrorSum = 0
totalLines = end - start
for i, row in enumerate(predReader):
if i == totalLines:
logger.info("Completed %d to %d" %(start, end))
break
expId, exp = expReader.readline().strip().split(',')
exp = float(exp)
predId = row[0]
row = np.array(row, dtype='float')
#assert expId == predId
#lineSum = 0
for j in xrange(1,71):
n = j - 1
squareErrorSum += (row[j]-(n>=exp))**2
#squareErrorSum += (row[j]-H(n,exp))**2
#lineSum += (row[j]-H(n,exp))**2
logger.info('SquareErrorSum %d to %d: %f' %(start, end, squareErrorSum))
return squareErrorSum def fileCmp(args):
'''check number of lines in two files are same'''
for count, line in enumerate(open('train_exp.csv')):
pass
expLines = count + 1 - 1 #discare header
for count, line in enumerate(open(args.predict)):
pass
predictLines = count + 1 - 1
print 'Lines(exp, predict):', expLines, predictLines
assert expLines == predictLines
evaluate.Lines = expLines if __name__ == "__main__":
# set up logger
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--predict',
help=("path to an predict probability file, this will "
"predict_changeTimePeriod.csv"))
args = parser.parse_args()
fileCmp(args)
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
result = []
blocks = multiprocessing.cpu_count()
linesABlock = evaluate.Lines / blocks
for i in xrange(blocks-1):
result.append(pool.apply_async(evaluate, (args, i*linesABlock, (i+1)*linesABlock)))
result.append(pool.apply_async(evaluate, (args, (i+1)*linesABlock, evaluate.Lines+1)))
pool.close()
pool.join()
result = [res.get() for res in result]
print result
print 'evaluate.Lines', evaluate.Lines
score = sum(result) / (70*evaluate.Lines)
print "score:", score

这里是有几个CPU核心就分成几个进程进行计算,希望尽量榨干CPU的计算能力。实际上运行过程中CPU的占用率也一直是100%

测试后计算结果与单进程一致,计算时间缩短为6分27秒,只快了一倍。

提升没有想象中的大。

经过尝试直接用StringIO将原文件每个进程加载一份到内存在进行处理速度也没有进一步提升,结合CPU的100%占用率考虑看起来是因为计算能力还不够。

看来计算密集密集型的工作还是需要用C来写的:)

C的实现要比python快太多了,单线程只需要50秒就能搞定,详见:

http://www.cnblogs.com/instant7/p/4313649.html

Python的并行求和例子的更多相关文章

  1. python实现并行爬虫

    问题背景:指定爬虫depth.线程数, python实现并行爬虫   思路:    单线程 实现爬虫类Fetcher                 多线程 threading.Thread去调Fet ...

  2. python抓取网页例子

    python抓取网页例子 最近在学习python,刚刚完成了一个网页抓取的例子,通过python抓取全世界所有的学校以及学院的数据,并存为xml文件.数据源是人人网. 因为刚学习python,写的代码 ...

  3. 【MPI】并行求和

    比较简单的并行求和 读入还是串行的 而且无法处理线程数无法整除数据总长度的情况 主要用到了MPI_Bcast MPI_Scatter MPI_Reduce typedef long long __in ...

  4. 快速掌握用python写并行程序

    目录 一.大数据时代的现状 二.面对挑战的方法 2.1 并行计算 2.2 改用GPU处理计算密集型程序 3.3 分布式计算 三.用python写并行程序 3.1 进程与线程 3.2 全局解释器锁GIL ...

  5. Python,while循环小例子--猜拳游戏(三局二胜)

    Python,while循环小例子--猜拳游戏(三局二胜) import random all_choice = ['石头', '剪刀', '布'] prompt = '''(0)石头 (1)剪刀 ( ...

  6. python中并行遍历:zip和map-转

    http://blog.sina.com.cn/s/blog_70e50f090101lat2.html 1.并行遍历:zip和map 内置的zip函数可以让我们使用for循环来并行使用多个序列.在基 ...

  7. python之第一个例子hello world

    python用缩进(四个空格,不是teble)来区分代码块 1. coding=utf-8    字符编码,支持汉字 #!/usr/bin/env python# coding=utf-8print ...

  8. [Spark][Python]DataFrame where 操作例子

    [Spark][Python]DataFrame中取出有限个记录的例子 的 继续 [15]: myDF=peopleDF.where("age>21") In [16]: m ...

  9. [Spark][Python]DataFrame select 操作例子

    [Spark][Python]DataFrame中取出有限个记录的例子 的 继续 In [4]: peopleDF.select("age")Out[4]: DataFrame[a ...

随机推荐

  1. Django框架orm

    一.django目录 二.登录注册 三.三件套 四.orm简介 五.基于orm的用户登录 一.django目录 -settings -urls -views -强调:setting中的'django. ...

  2. (初级篇)docker基础应用--01

    命令 获取镜像: docker pull //: ,如:docker pull nginx 查看镜像列表: docker images 查看镜像信息: docker inspect

  3. java -为什么重写equals(),还需要重写hashCode()?

    1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...

  4. windows安装mysql(5.7.26版本)压缩包

    1.解压安装包,进入文件夹,并创建一个data文件夹! 2.修改 my-default.ini 文件 [mysql] default-character-set=utf8 [mysqld] port ...

  5. JavaScript教程——对象的继承

    面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分面向对象的编程语言,都是通过“类”(class) ...

  6. Elasticsearch:fuzzy 搜索 (模糊搜索)

    在实际的搜索中,我们有时候会打错字,从而导致搜索不到.在Elasticsearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形. match查询具有"fu ...

  7. ACM-ICPC 2017 沈阳赛区现场赛 M. Wandering Robots && HDU 6229(思维+期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6229 参考题解:https://blog.csdn.net/lifelikes/article/det ...

  8. docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」

    很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...

  9. Could not load file or assembly "\win32_x86\dotnet1\crdb_adoplus.dll' or one of its dependencies.

     Could not load file or assembly 'file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Repor ...

  10. Mysql 修改最大链接数

    链接数过小经常出现ERROR 1040: Too many connections错误 show variables like '%max_connections%';  查看当前的mysql链接值 ...