不管你是待业还是失业,在这个被互联网围绕的时代里,选择用python计算,就多了一项技能,还怕找不到工作?,还怕不好找工作?小编就来告诉你这个专业的优势到底体现在哪里:Python 多核并行计算,Python入门到精通(2):使用Python计算数学算式,python并行计算(完结篇):并行方法总结,python计算360.65+239.2为什么会出现好多9,python计算两个时间戳相差多少秒,用Python写个计算器??。
1.Python 多核并行计算
以前写点小程序其实根本不在乎并行,单核跑跑也没什么问题,而且我的电脑也只有双核四个超线程(下面就统称核好了),觉得去折腾并行没啥意义(除非在做IO密集型任务)。然后自从用上了32核128GB内存,看到 htop 里面一堆空载的核,很自然地就会想这个并行必须去折腾一下。后面发现,其实 Python 的并行真的非常简单。 vs 自带的库又全又好用,这是我特别喜欢 Python 的原因之一。Python 里面有 和 threading 这两个用来实现并行的库。用线程应该是很自然的想法,毕竟(直觉上)开销小,还有共享内存的福利,而且在其他语言里面线程用的确实是非常频繁。然而,我可以很负责任的说,如果你用的是 CPython 实现,那么用了 threading 就等同于和并行计算说再见了(实际上,甚至会比单线程更慢),除非这是个IO密集型的任务。 指的是 python.org 提供的 Python 实现。是的,Python 是一门语言,它有各种不同的实现,比如 PyPy, Jython, 等等……我们用的最多的就是 CPython,它几乎就和 Python 画上了等号。CPython 的实现中,使用了 GIL 即全局锁,来简化解释器的实现,使得解释器每次只执行一个线程中的字节码。也就是说,除非是在等待IO操作,否则 CPython 的多线程就是彻底的谎言!有关 GIL 下面两个资料写的挺好的:Python的GIL是什么鬼,多线程性能究竟如何 the Python .Pool因为 GIL 的缘故 threading 不能用,那么我们就好好研究研究 。(当然,如果你说你不用 CPython,没有 GIL 的问题,那也是极佳的。)首先介绍一个简单粗暴,非常实用的工具,就是 .Pool。如果你的任务能用 ys = map(f, xs) 来解决,大家可能都知道,这样的形式天生就是最容易并行的,那么在 Python 里面并行计算这个任务真是再简单不过了。举个例子,把每个数都平方:import def f(x): return x * x cores = .cpu_count() pool = .Pool(processes=cores) xs = range(5) # method 1: map print pool.map(f, xs) # prints [0, 1, 4, 9, 16] # method 2: imap for y in pool.imap(f, xs): print y # 0, 1, 4, 9, 16, # method 3: imap_unordered for y in pool.imap_unordered(f, xs): print(y) # may be in any order map 直接返回列表,而 i 开头的两个函数返回的是迭代器;imap_unordered 返回的是无序的。当计算时间比较长的时候,我们可能想要加上一个进度条,这个时候 i 系列的好处就体现出来了。另外,有一个小技巧,就是输出 \r 可以使得光标回到行首而不换行,这样就可以制作简易的进度条了。cnt = 0 for _ in pool.imap_unordered(f, xs): sys.stdout.write('done %d/%d\r' % (cnt, len(xs))) cnt += 1 更复杂的操作要进行更复杂的操作,可以直接使用 .Process 对象。要在进程间通信可以使用:..Queue同步原语共享变量其中我强烈推荐的就是 Queue,因为其实很多场景就是生产者消费者模型,这个时候用 Queue 就解决问题了。用的方法也很简单,现在父进程创建 Queue,然后把它当做 args 或者 kwargs 传给 Process 就好了。使用 Theano 或者 等工具时的注意事项需要注意的是,在 import theano 或者 import 等调用了 Cuda 的工具的时候会产生一些副作用,这些副作用会原样拷贝到子进程中,然后就发生错误,如:could not retrieve CUDA device count: CUDA_ERROR_NOT_ 解决的方法是,保证父进程不引入这些工具,而是在子进程创建好了以后,让子进程各自引入。如果使用 Process,那就在 target 函数里面 import。举个例子:import def hello(taskq, resultq): import as tf config = tf.() config.gpu_options.allow_growth=True sess = tf.Session(config=config) while True: name = taskq.get() res = sess.run(tf.constant('hello ' + name)) resultq.put(res) if __name__ == '__main__': taskq = .Queue() resultq = .Queue() p = .Process(target=hello, args=(taskq, resultq)) p.start() taskq.put('world') taskq.put('') taskq.close() print(resultq.get()) print(resultq.get()) p.terminate() p.join() 如果使用 Pool,那么可以编写一个函数,在这个函数里面 import,并且把这个函数作为 传入到 Pool 的构造函数里面。举个例子:import def init(): global tf global sess import as tf config = tf.() config.gpu_options.allow_growth=True sess = tf.Session(config=config) def hello(name): return sess.run(tf.constant('hello ' + name)) if __name__ == '__main__': pool = .Pool(processes=2, =init) xs = ['world', '', 'Lequn Chen'] print pool.map(hello, xs) 首发于博客 Python 多核并行计算
2.Python入门到精通(2):使用Python计算数学算式
重点学习Python算式表达式和算术运算符,通过Shell窗口完成简单的数学运算1、 算术表达式在Pyhton语言中,数学算式中的小数或整数称为数值,数学算式称为算术表达式。算式中的数值称为操作数,算式中的运算符号称为运算符。在算术表达式中,算式的数值称为操作数,算式的运算符号称为运算符。在一些复杂的运算中,简单的表达式可以组合为复杂的表达式,其操作数本身可能就是一个表达式。算术表达式的计算结果为数值。例如上图表达式运算符“+”两边的操作数是(12+9)和(20/5),它们本身就是一个表达式。2、 算术运算符下面的表格对算术表达式使用到的运算符和数学算式中的运算符号进行了比较,这样就可以借助数学算式的运算符号来理解算术表达式的运算符。在算术运算符表格中,加减乘除运算符已经比较熟悉了。下面介绍取模运算符“%”、幂运算运算符“**”和取整除“//”运算符。取模运算符“%”用于取模运算,取模运算和数学中的取余运算是一样的,运算结果返回两个数值相除后的余数。上机操作:首先计算163除以7,163除以7的商是23余数是2。然后在IDLE的Shell窗口输入算术表达式“163 % 7”,按下电脑键盘的【Enter】键,Shell窗口执行输入的算术表达式并输出结果2。“15 % 5”的运算结果是多少呢?15除以5的余数是0。如果两数相除的余数是0,那么这两个数取模运算的结果是多少呢?上机操作:在Shell窗口输入“15 % 5”,Shell窗口执行算式,并输出结果0。幂运算符“**”用于数值的乘方运算,乘方运算是指一个数连续自乘n次,可以称为该数的n次乘方。例如:3个5连续自乘,可以称为3的5次乘方。除0外,任何数的0次乘方都为1。乘方运算的结果称为幂,因此乘方运算也称为幂运算。幂运算符“**”有两个操作数,运算符左边的操作数是乘方的底数,运算符右边的操作数是乘方的指数。例如:计算2的3次方,算术表达式可以这么写“2**3”,2是底数,3是指数。上机操作:在Shell窗口输入了算术表达式“2**3”,Shell窗口输出计算结果8。使用幂运算符时,运算符左侧的数值是乘方运算的底数,运算符右侧的数值是乘方运算的指数。取整除运算符“//”用于两数除法取商的整数部分,也就是运算结果返回两数相除后商的整数部分,商的小数部分及余数忽略。例如:19除以2的取整除运算结果是9。取整除运算符“//”有两个操作数,运算符左边的操作数是被除数,运算符右边的操作数是除数。上机操作:在Shell窗口输入算术表达式“19 // 2”,Shell窗口输出计算结果9。在输入“//”运算符时要注意和除法运算符“/”的区别,除法运算符是一个“/”符号,取整除是两个“//”符号。了解了算术运算符,做下面的练习!在上机练习前,先介绍一下练习的操作步骤:(1)首先启动IDLE开发工具,Shell窗口被打开。(2)在Shell窗口的命令提示符“>>>”的光标处输入算术表达式,算术表达式输入完成后,按下电脑键盘【Enter】键,Shell窗口会执行刚才输入的算术表达式,并在算术表达式的下面一行,输出算术表达式的计算结果。在Shell窗口输入上面的算式,每输入完成一个算式,就按下电脑键盘的【Enter】键执行该算式。>>> 21+79-3268>>> 28+120*8988>>> (45+16)/4*23350.75>>> 3**327>>> 19 % 61>>> 21 // 63>>>初学Python的同学在输入算术表达式时,可能会在输入法的中文模式下输入,如果在中文模式下输入,可能会导致算术表达式的语法错误。上面的错误就是在输入算式时,在中文模式下输入了小括号“(”,Shell窗口会输出“语法错误:标识符中的字符无效”错误。3、 运算符的优先级算术运算符的优先级同四则运算的优先级相同,下表给出了算术运算符的优先级,表中优先级的数字越小,优先级越高。优先级的结合性是指当一个表达式包含优先级相同的运算符时,表达式是从左到右顺序运算,还是从右到左顺序运算。4、 上机操作请同学们先用笔算计算下面的算术表达式,然后在用Python验证算术表达式的计算结果是否正确。(1)0.94*2.6-0.9*2.6(2)3**2//3+(12-5)(3)6/3+10//3**2编程训练营APP创新在线学习模式,学习编程不再半途而废安卓手机应用商店搜索编程训练营下载
3.python并行计算(完结篇):并行方法总结
由于python相当易学易用,现在python也较多地用于有大量的计算需求的任务。本文介绍几个并行模块,以及实现程序并行的入门技术。本文比较枯燥,主要是为后面上工程实例做铺垫。完结篇对前期介绍的所有模块及实例进行总结,比较各并行方法的特点和异同。所有比较都以文字形式呈现了,欢迎指正或完善,做成表格可能效果更好。模块介绍:爱coding:python并行计算(上):、模块爱coding:python并行计算(上):pathos模块爱coding:python并行计算(上):.futures、pp模块实例:爱coding:python并行计算(下):模块实例爱coding:python并行计算(下):pathos模块实例爱coding:python并行计算(下):.futures、pp模块实例注:以下模块、类与其他内容相同或接近,不重复介绍和比较:模块:与模块接口基本一致。pathos.pp.pp模块:实质也即pp模块,与独立的pp模块完全相同。pathos..Pool():与.Pool()完全相同。pathos..()、pathos.pools.():与pathos..()完全相同。pathos.pp.()、pathos.parallel.()、pathos.parallel.()、pathos.pools.():与pathos.pp.()完全相同。pathos.serial.():实际是串行(非并行),不参与比较。1、按并行分类(1)阻塞(非并行):非并行方式下,子进程串行执行(完成一个,然后开始下一个),实际不是并行。包括:.Pool(),apply方法pathos..(),pipe方法pathos.pp.(),pipe方法pathos.pp.(),map方法pathos.pp.(),imap方法(2)批次并行:批次并行指一批子进程并行执行,且直到该批次所有子进程完成后,才开始下一批次。包括:.Process() #只能一批一批地添加进程,同一批次内并行(3)异步:异步执行指的是一批子进程并行执行,且子进程完成一个,就新开始一个,而不必等待同一批其他进程完成。包括:.Pool(),apply_async方法.Pool(),map方法.Pool(),map_async方法.Pool(),imap方法.Pool(),imap_unordered方法.Pool(),starmap方法.Pool(),starmap_async方法.futures.(),submit方法.futures.(),map方法pathos..(),map方法pathos..(),imap方法pathos..(),uimap方法pathos..(),amap方法pathos..(),apipe方法pp.Server(),submit方法pathos.pp.(),apipe方法pathos.pp.(),amap方法pathos.pp.(),uimap方法2、按传参分类(1)单个任务,任务多参数:.Process().futures.(),submit方法.Pool(),apply方法.Pool(),apply_async方法pathos..(),pipe方法pathos..(),apipe方法pp.Server(),submit方法pathos.pp.(),pipe方法pathos.pp.(),apipe方法(2)多个任务,任务单参数:.Pool(),map方法.Pool(),map_async方法.Pool(),imap方法.Pool(),imap_unordered方法(3)多个任务,任务多参数:(a)func(iterable[i])形式:iterable的每个元素(元素本身也是iterable)对应func的多个参数。.Pool(),starmap方法.Pool(),starmap_async方法(b)func(iterable1[i], iterable2[i], ...)形式:每个iterable对应func的一个参数。.futures.(),map方法pathos..(),map方法pathos..(),imap方法pathos..(),uimap方法pathos..(),amap方法pathos.pp.(),map方法pathos.pp.(),amap方法pathos.pp.(),imap方法pathos.pp.(),uimap方法3、按返回分类(1)返回任务返回值.Pool(),apply方法pathos..(),pipe方法pathos.pp.(),pipe方法(2)返回.Pool(),map方法.Pool(),starmap方法pathos..(),map方法pathos.pp.(),map方法(3)返回返回MapResult或实例,通过get方法获取返回值。需要注意的是:由于每个实例对应单个子进程,其get方法本身是阻塞的,因此,在进程添加过程中不可包含get方法,而应在所有进程完成后,再一起调用get方法。对于MapResult不存在该问题,因为所有子进程只会一起返回一个MapResult实例。包括:.Pool(),apply_async方法pathos..(),apipe方法pathos.pp.(),apipe方法(4)返回.Pool(),map_async方法.Pool(),starmap_async方法pathos..(),amap方法pathos.pp.(),amap方法(5)返回迭代器或生成器迭代器/生成器对内存的需求会小得多,但速度比普通方法要慢很多(未验证)。不过,对于本文的小型任务,看不出差别。(a)按顺序:即按任务添加顺利返回。.Pool(),imap方法.futures.(),map方法pathos..(),imap方法pathos.pp.(),imap方法(b)不按顺序:实际按任务完成顺序返回。.Pool(),imap_unordered方法pathos..(),uimap方法pathos.pp.(),uimap方法(6)无直接返回值.Process() #无直接返回值,可通过进程间通信的方式返回任务返回值。.futures.(),submit方法 #future对象可以通过result方法获取子进程任务返回值。但该方法是阻塞的,因此,应在所有子进程完成后再调用。pp.Server(),submit方法 #Task对象可调用(即Task()),调用可返回任务返回值。但调用是阻塞的,因此,应在所有子进程完成后再调用。
4.python计算360.65+239.2为什么会出现好多9
深层原因是在于计算机无法精确表示部分浮点数时,只能近似表示,因此存在误差,这是所有编程语言都存在的问题,可深入了解下,这种问题无法彻底解决; 常见的应对办法是在制定的精度要求下,乘法-》截取-》除法,如 0.1 + 0.2 = 0. (保留1位小数)int(0. *10 ) /10,截取方法也有很多可了解下;
5.python计算两个时间戳相差多少秒
在Python编程中,使用datetime模块计算两个时间的差:>>> import datetime>>> d1=datetime.datetime(2015,7,5)>>> d2=datetime.datetime(2005,7,4)>>>(d1-d2).seconds//结果86400s# 计算两个时间的间隔天数# 注意:输入月份和天时,不能输入08,09等,会被识别为 8 进制而出错!(8进制是不超过07的)# 解决办法:要把月份和天前面的0去掉。
6.用Python写个计算器
我们常见的计算辅助工具有两种,一种是古人发明的算盘,另一种就是我们现代人发明的计算器,与算盘相比,计算器无论是便利性还是计算速度都是优于算盘的,本文我们使用 Python 来实现一个简易的计算器。实现我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,计算器的图形界面我们使用 tkinter 库实现,下面看一下具体实现过程。首先,我们画一个主窗口,代码实现如下:# 创建主窗口 tk = tkinter.Tk() # 设置窗口大小和位置 tk.geometry('300x210+500+200') # 不允许改变窗口大小 tk.resizable(False, False) # 设置窗口标题 tk.title('计算器')看一下效果:我们接着画显示器,代码实现如下:# 自动刷新字符串变量,可用 set 和 get 方法进行传值和取值 = tkinter.StringVar(tk, '') # 创建单行文本框 = tkinter.Entry(tk, =) # 设置文本框为只读 ['state'] = 'readonly' # 设置文本框坐标及宽高 .place(x=20, y=10, width=260, height=30)看一下效果:再接着画键盘,代码实现如下:# 按钮显示内容 bvalue = ['C', '+', '-', '//', '2', '0', '1', '√', '3', '4', '5', '*', '6', '7', '8', '.', '9', '/', '**', '='] index = 0 # 将按钮进行 5x4 放置 for row in range(5): for col in range(4): d = bvalue[index] index += 1 btnDigit = tkinter.Button(tk, text=d, command=lambda x=d: onclick(x)) btnDigit.place(x=20 + col * 70, y=50 + row * 30, width=50, height=20)看一下效果:界面画完了,我们看一下处理运算逻辑的代码,如下所示:# 点击事件 def onclick(btn): # 运算符 operation = ('+', '-', '*', '/', '**', '//') # 获取文本框中的内容 content = .get() # 如果已有内容是以小数点开头的,在前面加 0 if content.('.'): content = '0' + content # 字符串可以直接用+来增加字符 # 根据不同的按钮作出不同的反应 if btn in '': # 按下 0-9 在 content 中追加 content += btn elif btn == '.': # 将 content 从 +-*/ 这些字符的地方分割开来 lastPart = re.split(r'\+|-|\*|/', content)[-1] if '.' in lastPart: # 信息提示对话框 tkinter..showerror('错误', '重复出现的小数点') return else: content += btn elif btn == 'C': # 清除文本框 content = '' elif btn == '=': try: # 对输入的表达式求值 content = str(eval(content)) except: tkinter..showerror('错误', '表达式有误') return elif btn in operation: if content.endswith(operation): tkinter..showerror('错误', '不允许存在连续运算符') return content += btn elif btn == '√': # 从 . 处分割存入 n,n 是一个列表 n = content.split('.') # 如果列表中所有的都是数字,就是为了检查表达式是不是正确的 if all(map(lambda x: x.isdigit(), n)): content = eval(content) ** 0.5 else: tkinter..showerror('错误', '表达式错误') return # 将结果显示到文本框中 .set(content)整体实现完了之后,我们来演示一下,看一下效果:是不是有内味了。打包为了更加方便的使用,我们可以将 Python 代码打包成 exe 文件,打包我们使用 ,安装用 pip install 命令即可。打包时我们使用 --onefile -- counter.py 命令即可,此时打包生成的文件是使用的默认图标,如果我们想指定自己的图标可以添加参数 --icon="xxx\xxx.ico",打包生成的文件在 dist 目录,如下图所示:此时,我们直接运行 exe 文件就行了。用 Python 写个计算器本文非首发于个人号
就拿大数据说话,优势一目了然,从事IT行业,打开IT行业的新大门,找到适合自己的培训机构,进行专业和系统的学习。