《Python数据分析》一1.5 一个简单的应用

1.5 一个简单的应用

假设要对向量a和b进行求和。注意,这里“向量”这个词的含义是数学意义上的,即一个一维数组。在第3章“统计学与线性代数”中,将遇到一种表示矩阵的特殊NumPy数组。向量a存放的是整数0到n-1的2次幂。如果n等于3,那么a保存的是0、1和4。向量b存放的是整数0到n的3次幂,所以如果n等于3,那么向量b等于0、1或者8。如果使用普通的Python代码,该怎么做呢?

在我们想出了一个解决方案后,可以拿来与等价的NumPy方案进行比较。

下面的函数没有借助NumPy,而是使用纯Python来解决向量加法问题:

def pythonsum(n):
  a = range(n)
  b = range(n)
  c = []

  for i in range(len(a)):
   a[i] = i ** 2
   b[i] = i ** 3
   c.append(a[i] + b[i])

  return c

下面是利用NumPy解决向量加法问题的函数:

def numpysum(n):
 a = numpy.arange(n) ** 2
 b = numpy.arange(n) ** 3
 c = a + b
 return c

注意,numpysum()无需使用for语句。此外,我们使用了来自NumPy的arange()函数,它替我们创建了一个含有整数0到n的NumPy数组。这里的arange()函数也是从NumPy导入的,所以它加上了前缀numpy。

现在到了真正有趣的地方。我们在前言中讲过,NumPy在进行数组运算时,速度是相当快的。可是,到底有多么快呢?下面的程序代码将为我们展示numpysum()和pythonsum()这两个函数的实耗时间,这里以微秒为单位。同时,它还会显示向量sum最后面的两个元素值。下面来看使用Python和NumPy能否得到相同的答案:

#!/usr/bin/env/python

import sys
from datetime import datetime
import numpy as np

"""
 This program demonstrates vector addition the Python way.
 Run from the command line as follows

 python vectorsum.py n

 where n is an integer that specifies the size of the vectors.

 The first vector to be added contains the squares of 0 up to n.
 The second vector contains the cubes of 0 up to n.
 The program prints the last 2 elements of the sum and the elapsed 
time.
"""

def numpysum(n):
  a = np.arange(n) ** 2
  b = np.arange(n) ** 3
  c = a + b

  return c

def pythonsum(n):
 a = range(n)
  b = range(n)
  c = []

  for i in range(len(a)):
   a[i] = i ** 2
   b[i] = i ** 3
   c.append(a[i] + b[i])

  return c

size = int(sys.argv[1])
start = datetime.now()
c = pythonsum(size)
delta = datetime.now() - start
print "The last 2 elements of the sum", c[-2:]
print "PythonSum elapsed time in microseconds", delta.microseconds
start = datetime.now()
c = numpysum(size)
delta = datetime.now() - start
print "The last 2 elements of the sum", c[-2:]
print "NumPySum elapsed time in microseconds", delta.microseconds

对于1000个、2000个和3000个向量元素,程序的结果如下所示:

$ python vectorsum.py 1000
The last 2 elements of the sum [995007996, 998001000]
PythonSum elapsed time in microseconds 707
The last 2 elements of the sum [995007996 998001000]
NumPySum elapsed time in microseconds 171

$ python vectorsum.py 2000

The last 2 elements of the sum [7980015996, 7992002000]
PythonSum elapsed time in microseconds 1420
The last 2 elements of the sum [7980015996 7992002000]
NumPySum elapsed time in microseconds 168

$ python vectorsum.py 4000

The last 2 elements of the sum [63920031996, 63968004000]
PythonSum elapsed time in microseconds 2829
The last 2 elements of the sum [63920031996 63968004000]
NumPySum elapsed time in microseconds 274

显而易见,NumPy的速度比等价的常规Python代码要快很多。有一件事情是肯定的:无论是否使用NumPy,计算结果都是相同的。不过,结果的显示形式还是有所差别的:numpysum()函数给出的结果不包含逗号。为什么会这样?别忘了,我们处理的不是Python的列表,而是一个NumPy数组。有关NumPy数组的更多内容,将在第2章“NumPy数组”中详细介绍。

时间: 2024-10-21 10:24:56

《Python数据分析》一1.5 一个简单的应用的相关文章

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

使用Python的Twisted框架实现一个简单的服务器_python

预览  twisted是一个被设计的非常灵活框架以至于能够让你写出非常强大的服务器.这种灵活的代价是需要好通过好几个层次来实现你的服务器, 本文档描述的是Protocol层,你将在这个层次中执行协议的分析和处理,如果你正在执行一个应用程序,那么你应该在读过top level的为twisted写插件一节中的怎样开始写twisted应用程序之后阅读本章.这个文档只是和TCP,SSL和Unix套接字服务器有关,同时也将有另一份文档专门讲解UDP.   你的协议处理类通常是twisted.interne

Python操作json数据的一个简单例子_python

更多的信息,可以参考python内部的json文档: python>>> help(json) 或者官方文档: http://docs.python.org/library/json.html#module-json. 下面给出一个使用python解析json的简单例子: 复制代码 代码如下: #!/usr/bin/python import json #Function:Analyze json script #Json is a script can descript data st

Python写的一个简单监控系统

  这篇文章主要介绍了Python写的一个简单监控系统,本文讲解了详细的编码步骤,并给给出相应的实现代码,需要的朋友可以参考下 市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 首先数据库建表 建立一个数据库"falcon",建表语句如下: ? 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE `stat` ( `

用Python实现一个简单的多线程TCP服务器的教程

  这篇文章主要介绍了用Python实现一个简单的多线程TCP服务器的教程,示例的运行环境为Windows操作系统,需要的朋友可以参考下 最近看<python核心编程>,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程. 其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandl

Python实现一个简单的能够上传下载的HTTP服务器

这篇文章主要介绍了用Python实现一个简单的能够上传下载的HTTP服务器,是Python网络编程学习当中的基础,本文示例基于Windows操作系统实现,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5

从零构建一个简单的 Python 框架

这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么.你可以在这个代码仓库中找到这个项目的完整代码.我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣.它让我知道了 web 应用是如何工作的,而且这比我想的要容易的多! 为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何工作的很感兴趣,因为你想要成

方法-python继承的一个简单问题

问题描述 python继承的一个简单问题 python为什么我继承了Threading的Thread方法, class myThread(threading.Thread): def __init__(self,threadname): threading.Thread.__init__(self,name=threadname) 这就是问题为什么还要 调用初始化一下?. 初始化,能达到什么效果,就是这句话有什么用途?或者 我不初始化有什么差别? java里面 不需要这样呀?python这样写是

《Python数据科学实践指南》——0.4 一个简单的例子

0.4 一个简单的例子 下面是一段用Python编写的有趣的代码,这里所用的模块并不会在本书中进行讲解,仅仅是向购买本书的你表示我的感激. 代码清单如下: # ! /usr/bin/python # -- coding: utf-8 -- import sys from colorama import init init(strip=not sys.stdout.isatty()) from termcolor import cprint from pyfiglet import figlet_