stackless python初体验

stackless python真是毁三观,算斐波那契数列,n为100000(十万),运行时间2。2秒左右

这里写一下感悟:

stackless python从字面上理解就是没有栈的python,怎么做到没有栈呢?基于堆栈的语言是怎么实现的:

1、一般将函数的调用推进栈里面,后入栈单元计算完之后,先入栈的才能够完成

2、栈里面的单元怎么通信呢?今天刚好做完DDos攻击的实验,提醒我了这点:栈的单元通过入口地址和返回地址与它的前后单元通信。

3、栈的厚度有限制,貌似是1000多,就是说,迭代到1000多层就不能继续进栈了,当然可以将层数认为调高。大概原理就是这样。

stackless python说,我不要栈!那么不用栈是怎么写程序呢?

1、他用一种叫做tasklet的东西代替了堆栈里面的单元

2、这些单元通过一种叫做channel的机制来通信

3、因为不是基于堆栈,所以这些tasklet的数量你想要多少有多少,就像这里,100000

tasklet又叫做微线程(microthread),所以说,是在python进程里面的一个线程再分出来的“thread”。它被设计为在各个tasklet之间的切换开销远远小于系统的线程。

一个tasklet可以通过往另外一个tasklet的channel来发送信息,自己进入阻塞状态,然后激活另一个tasklet

以斐波那契数列为例:

往常,我们使用递归求斐波那契数列的时候。。。。。就不说了,大家都懂

如果换做stackless的版本呢?

堆栈没了,我们有一个个的tasklet,这些tasklet里面包含了一个channel,一个个的tasklet

通过将自己的channel传给下一个tasklet,下一个channel通过将自己的处理结果发送到前一个tasklet的channel里面实现通信。

其实如果用“微线程”的方式去理解tasklet,你可以认为,它其实是有“堆栈”的,就像系统级别的线程一样,但是这个堆栈仅仅是用于调用一个函数,或者说,将这个函数的调用放进一个tasklet里面。

通过这种方式(其实我不知道自己说明白没有。。),就形成了一条tasklet链,如果我们将他们想象成层叠的形状,其实跟堆栈的形状也是挺相似的,但是他们不叫堆栈,叫做tasklet,而且性能比堆栈的性能要好。记住这种工具的名字,它叫做stackless python。

下面是计算斐波那契数列的代码:

import stackless

dic = {}

def factorial(n):

if n == 1:

return 1

elif n == 2:

return 2

else:

return task(n-1) + task(n-2)

def task(n):

if str(n) in dic:

return dic[str(n)]

chann = stackless.channel()

stackless.tasklet(compute)(n,chann)

result = chann.receive()

dic[str(n)] = result

return result

def compute(n,chann):

return chann.send(factorial(n))

print factorial(100000)

然后用堆栈版本试了一下,先将python堆栈的层数上线改了100000,运行,大概1.3秒到1.5秒,其实stackless与堆栈相比没有多大优势。

堆栈版本代码:

import sys

sys.setrecursionlimit(100000)

dic = {}

def factorial(n):

if n == 1:

return 1

elif n == 2:

return 2

elif str(n) in dic:

return dic[str(n)]

else:

a = factorial(n-1)

if str(n-1) not in dic:

dic[str(n-1)] = a

b = factorial(n-2)

if str(n-2) not in dic:

dic[str(n-2)] = a

return a + b

print factorial(99999)

这里仅仅讲到的是stackless的这么一种用法,一般stackless的用途还是在替代系统线程这方面,用来做并发有c语言级别的性能,这个以后再做测试

时间: 2024-10-11 22:49:25

stackless python初体验的相关文章

ipython及Python初体验

阅读目录: Python环境体验 Python编辑器 ipython安装 Python提示符 Python初体验 print和变量 变量操作 内建函数:方法 数学运算:简单算术.随机数 关于模块 一.Python环境体验 1.常见Python编辑器介绍 1.在linux下使用vim 编辑Python脚本时,推荐--没有道理-- 2.Eclipse 3.notepad++:挺好用的一款编辑工具 4.IDLE (官方自带)交互式的开发语言集成环境 5.pycharm  第三方的工具:ipython

python初体验之小小爬虫

小月月是个懒家伙,博客更新好慢... 前几天拿到某公司的面试题,要求在Linux/Ubuntu/Debian/Suse/Centos下用python2.7开发一个爬虫,抓取百度新闻搜索结果的前三页标题+url. 这可把对python一窍不通的小月月难住了,肿么办呢...哦,最简单有效直接的方法就是网上查资料,ok,go~! 首先感谢http://www.1point3acres.com/bbs/thread-83337-1-1.html跟http://blog.csdn.net/column/d

python初体验--我对python的体会

接触了python已经两周了,从一个程序小白发展到了对python有了一些简单的认识,虽然以前学过一些c语言,但是能感觉出来python与c之间的差别很大,python的计算能力比c要高得多,而且各种包使python使用起来非常方便,这可以让我们再平时可以利用python制作一些小的程序来计算一些问题,使学这门语言有了更多实用性.而且上课老师为我们展示python通过arduino制作温度计算和bim指数,并且通过数据绘画出图形化界面,利用其中的函数把数据做成图表使我更加感兴趣,感觉这些实验很有

Python初体验

本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语

VS Code python初体验笔记

之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Python等)而且这是微软自家写的,这就引起我的浓烈兴趣了,查了下VS Code发现这东西不错,而且广受程序员的喜爱,不仅能够在windows上运行编写的程序,而且还能在Mac,linux平台上运行,并且开源(这从侧面说明了微软的巨大改变,其开源力度真是前所未见,我很期待微软的开源框架asp.net co

Python初体验之基础语法(二)

所有测试语句基于Python 2.7.6 , Ubuntu 14.04 LTS 自学Python,如果哪里说的不对,还请指正.谢谢. 示例绝大部分来自博客园vamei的python教程 1.文件读写操作 一. 按字节读取文件 #!/usr/bin/env python #coding=UTF-8 #默认python编码是ASCII编码 要支持中文 #加上coding=UTF-8的声明 # open()打开文件 r只读 w写入 a追加 r+ w+ a+模式 # a+方式打开文件 指针指向结尾 ,

第三节 Hello world --python初体验

祭旗--hello world 据说简单优雅.功能强大是python的魅力所在,这里看到简单了,优雅是什么样的,接下来的学习中慢慢体会吧! 1 print ("Hello world") 数据类型和变量 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型.在Python中,能够直接处理的数据类型有以下几种:整数型.浮点型.

python 初体验

微博那边的程序媛计划的python课程. 烧烤了一个弱智机器人. 完全用对话推进的一个聊天,为了它更像一个活人把训练选项隐藏了,可能只适合自己玩(远目) 有BADEND线,再琢磨琢磨感觉自己可以写个avg游戏了(远目) 就问问windows写python只能这么反人类吗- - 1 #coding:utf-8 2 #!/usr/bin/env python 3 # 4 # str=raw_input(unicode('你要显示的中文','utf-8').encode('gbk')); 5 impo

Python初体验之基础语法(四)

所有测试语句基于Python 2.7.3 , Ubuntu 12.04 自学Python,如果哪里说的不恰当,还请指正.谢谢. 示例绝大部分来自博客园vamei的python教程 1.循环对象 #!/usr/bin/env python #coding=UTF-8 #包含一个next()方法 每次循环调用next() #直到StopIteration异常出现 停止调用next()方法 f = open('test.txt') for line in f: print line #生成器 自定义一