Python中的库都有哪些?标准库
sys
系统相关的参数和函数 。sys 库一般用来访问和修改系统相关信息 , 比如查看 python 版本、系统环境变量、模块信息和 python 解释器相关信息等等 。
os
操作系统接口模块 。这个库提供了访问操作系统相关依赖的方式,比如输入输出操作、读写操作、操作系统异常错误信息、进程线程管理、文件管理、调度程序等等 。
re
正则表达式操作 。这个库是我喜欢并且经常会用到的库,在对大量字符串进行处理的时候用正则表达式是最快速有效的方式,但是正则表达式的学习曲线较高,有兴趣的朋友可以访问这个网站学习 。
math
数学函数库 。math 库提供了对 C 语言标准定义的数学函数访问 , 比如数论(Number-theoretic)的各种表示方法、幂和对数函数(Power and logarithmic functions)、三角函数(Trigonometric functions)、常量圆周率(π)和自然常数(e)等等 。
random
生成伪随机数 。
伪随机数与随机数(真随机数)不同的是执行环境,随机数是真实世界中通过物理过程实践得出结论,而伪随机数是通过计算机的特定算法生成的数,所以这个过程是可预测的、有规律的,只是循环周期较长,并不能与现实场景相切合 。
random库提供生成随机数,可以模拟现实世界中随机取数、随机抽奖等等 。望采纳
python logging.formatter可以带变量吗可以,不然怎么格式化数据
Logger
Logger是Logging模块的主体,进行以下三项工作:
1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler
其常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter
Handler
Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志 。具体的应用如一个应用要把所有的日志打在文件中,并把ERROR以上级别的日志打印到屏幕,把CRITICAL级别的日志发邮件 。
常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter
Formatter
顾名思义,这个类配置了日志的格式,参数是日志的格式fmt和时间的格式datefmt
下一篇将解释下一个应用如何配置多个Handler和多个应用配置多个Logger 。
python是什么样的编程语言?Python是一种跨平台的计算机程序设计语言 。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加 , 越来越多被用于独立的、大型项目的开发 。
Python还是一门解释型的编程语言 , Python也是面向对象的编程语言 。对比其他编程语言来说 , Python入门要简单很多,更接近自然语言和正常思维方法,可以直接应用到工作中;当我们学习Python的时候非常容易上手,要比其他语言简单很多,几乎可以说是无所不能 。
虽然Python体积小但是功能强大,可以做互联网应用也可以做网站开发,灵活、易懂,开源 。支持各种主流的操作系统,更加接近真实语言思维 。在工业上Python被普遍使用快速建立概念模型,运行Python语言的产品已经成为了一种技术趋势 。而且Python拥有大量的开发库 , 方便控制各种硬件,可以满足不同场合需求 。
使用Python进行项目开发的时候,代码具有很高的可读性 , 它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来非常的简单整洁,要比其他的语言更好 。
python对数据库表格里面的内容增删查改怎么写本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
具体需求:
员工信息表程序,实现增删改查操作:
可进行模糊查询 , 语法支持下面3种:
select name,age from staff_data where age22多个查询参数name,age 用','分割
select * from staff_data where dept = 人事
select * from staff_data where enroll_date like 2013
查到的信息,打印后 , 最后面还要显示查到的条数
可创建新员工纪录,以phone做唯一键,phone存在即提示,staff_id需自增,添加多个记录record1/record2中间用'/'分割
insert into staff_data values record1/record2
可删除指定员工信息纪录,输入员工id,即可删除
delete from staff_data where staff_id=5andstaff_id=10
可修改员工信息,语法如下:
update staff_table set dept=Market,phone=13566677787where dept = 运维多个set值用','分割
使用re模块,os模块,充分使用函数精简代码,熟练使用 str.split()来解析格式化字符串
由于,sql命令中的几个关键字符串有一定规律,只出现一次,并且有顺序!!!
按照key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit']的元素顺序分割sql.
分割元素作为sql_dic字典的key放进字典中.分割后的列表为b,如果len(b)1,说明sql字符串中含有分割元素,同时b[0]对应上一个分割元素的值,b[-1]为下一次分割对象!
这样不断迭代直到把sql按出现的所有分割元素分割完毕,但注意这里每次循环都是先分割后赋值!!!当前分割元素比如'select'对应的值,需要等到下一个分割元素
比如'from'执行分割后的列表b,其中b[0]的值才会赋值给sql_dic['select'] ,所以最后一个分割元素的值,不能通过上述循环来完成,必须先处理可能是最后一个分割元素,再正常循环!!
在这sql语句中,有可能成为最后一个分割元素的 'limit' ,'values', 'where',按优先级别,先处理'limit' ,再处理'values'或 'where'.....
处理完得到sql_dic后,就是你按不同命令执行,对数据文件的增删改查,最后返回处理结果!!
示例代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
【python函数分发 python 分发包】# _*_coding:utf-8_*_# Author:Jaye Heimport reimport osdef sql_parse(sql, key_lis): ''' 解析sql命令字符串,按照key_lis列表里的元素分割sql得到字典形式的命令sql_dic :param sql: :param key_lis: :return: ''' sql_list = [] sql_dic = {} for i in key_lis:b = [j.strip() for j in sql.split(i)]if len(b)1:if len(sql.split('limit'))1:sql_dic['limit'] = sql.split('limit')[-1]if i == 'where' or i == 'values':sql_dic[i] = b[-1]if sql_list:sql_dic[sql_list[-1]] = b[0]sql_list.append(i)sql = b[-1]else:sql = b[0]if sql_dic.get('select'):if not sql_dic.get('from') and not sql_dic.get('where'):sql_dic['from'] = b[-1] if sql_dic.get('select'):sql_dic['select'] = sql_dic.get('select').split(',') if sql_dic.get('where'):sql_dic['where'] = where_parse(sql_dic.get('where')) return sql_dicdef where_parse(where): ''' 格式化where字符串为列表where_list,用'and', 'or', 'not'分割字符串 :param where: :return: ''' casual_l = [where] logic_key = ['and', 'or', 'not'] for j in logic_key:for i in casual_l:if i not in logic_key:if len(i.split(j))1:ele = i.split(j)index = casual_l.index(i)casual_l.pop(index)casual_l.insert(index, ele[0])casual_l.insert(index 1, j)casual_l.insert(index 2, ele[1])casual_l = [k for k in casual_l if k] where_list = three_parse(casual_l, logic_key) return where_listdef three_parse(casual_l, logic_key): ''' 处理临时列表casual_l中具体的条件,'staff_id5'--['staff_id','','5'] :param casual_l: :param logic_key: :return: ''' where_list = [] for i in casual_l:if i not in logic_key:b = i.split('like')if len(b)1:b.insert(1, 'like')where_list.append(b)else:key = ['', '=', '']new_lis = []opt = ''lis = [j for j in re.split('([=])', i) if j]for k in lis:if k in key:opt= kelse:new_lis.append(k)new_lis.insert(1, opt)where_list.append(new_lis)else:where_list.append(i) return where_listdef sql_action(sql_dic, title): ''' 把解析好的sql_dic分发给相应函数执行处理 :param sql_dic: :param title: :return: ''' key = {'select': select,'insert': insert,'delete': delete,'update': update} res = [] for i in sql_dic:if i in key:res = key[i](sql_dic, title) return resdef select(sql_dic, title): ''' 处理select语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as fh:filter_res = where_action(fh, sql_dic.get('where'), title)limit_res = limit_action(filter_res, sql_dic.get('limit'))search_res = search_action(limit_res, sql_dic.get('select'), title) return search_resdef insert(sql_dic, title): ''' 处理insert语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r ', encoding='utf-8') as f:data = https://www.04ip.com/post/f.readlines()phone_list = [i.strip().split(',')[4] for i in data]ins_count = 0if not data:new_id = 1else:last = data[-1]last_id = int(last.split(',')[0])new_id = last_id 1record = sql_dic.get('values').split('/')for i in record:if i.split(',')[3] in phone_list:print('\033[1;31m%s 手机号已存在\033[0m' % i)else:new_record = '%s,%s\n' % (str(new_id), i)f.write(new_record)new_id= 1ins_count= 1f.flush() return ['insert successful'], [str(ins_count)]def delete(sql_dic, title): ''' 处理delete语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as r_file,\open('staff_data_bak', 'w', encoding='utf-8') as w_file:del_count = 0for line in r_file:dic = dict(zip(title.split(','), line.split(',')))filter_res = logic_action(dic, sql_dic.get('where'))if not filter_res:w_file.write(line)else:del_count= 1w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['delete successful'], [str(del_count)]def update(sql_dic, title): ''' 处理update语句命令 :param sql_dic: :param title: :return: ''' set_l = sql_dic.get('set').strip().split(',') set_list = [i.split('=') for i in set_l] update_count = 0 with open('staff_data', 'r', encoding='utf-8') as r_file,\open('staff_data_bak', 'w', encoding='utf-8') as w_file:for line in r_file:dic = dict(zip(title.split(','), line.strip().split(',')))filter_res = logic_action(dic, sql_dic.get('where'))if filter_res:for i in set_list:k = i[0]v = i[-1]dic[k] = vline = [dic[i] for i in title.split(',')]update_count= 1line = ','.join(line) '\n'w_file.write(line)w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['update successful'], [str(update_count)]def where_action(fh, where_list, title): ''' 具体处理where_list里的所有条件 :param fh: :param where_list: :param title: :return: ''' res = [] if len(where_list) != 0:for line in fh:dic = dict(zip(title.split(','), line.strip().split(',')))if dic['name'] != 'name':logic_res = logic_action(dic, where_list)if logic_res:res.append(line.strip().split(',')) else:res = [i.split(',') for i in fh.readlines()] return res passdef logic_action(dic, where_list): ''' 判断数据文件中每一条是否符合where_list条件 :param dic: :param where_list: :return: ''' logic = [] for exp in where_list:if type(exp) is list:exp_k, opt, exp_v = expif exp[1] == '=':opt = '=='logical_char = "'%s'%s'%s'" % (dic[exp_k], opt, exp_v)if opt != 'like':exp = str(eval(logical_char))else:if exp_v in dic[exp_k]:exp = 'True'else:exp = 'False'logic.append(exp) res = eval(' '.join(logic)) return resdef limit_action(filter_res, limit_l): ''' 用列表切分处理显示符合条件的数量 :param filter_res: :param limit_l: :return: ''' if limit_l:index = int(limit_l[0])res = filter_res[:index] else:res = filter_res return resdef search_action(limit_res, select_list, title): ''' 处理需要查询并显示的title和相应数据 :param limit_res: :param select_list: :param title: :return: ''' res = [] fields_list = title.split(',') if select_list[0] == '*':res = limit_res else:fields_list = select_listfor data in limit_res:dic = dict(zip(title.split(','), data))r_l = []for i in fields_list:r_l.append((dic[i].strip()))res.append(r_l) return fields_list, resif __name__ == '__main__': with open('staff_data', 'r', encoding='utf-8') as f:title = f.readline().strip() key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit'] while True:sql = input('请输入sql命令,退出请输入exit:').strip()sql = re.sub(' ', '', sql)if len(sql) == 0:continueif sql == 'exit':breaksql_dict = sql_parse(sql, key_lis)fields_list, fields_data = https://www.04ip.com/post/sql_action(sql_dict, title)print('\033[1;33m结果如下:\033[0m')print('-'.join(fields_list))for data in fields_data:print('-'.join(data))
总结
以上就是这篇文章的全部内容了 , 希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持 。
python运行多线程程序会影响电脑硬件么PYTHON多进程CPU利用率高,PYTHON多进程反而慢
Python · 2022年7月14日 · 338 次浏览
导读
很多时候,当我们需要使用Python来处理大量的数据的时候,为了缩短处理的时间,我们会使用多线程或多进程来并行处理任务 。
由于Python全局解释器锁的存在,导致在执行多线程的时候实际上只有一个线程在运行,这使得多核CPU无法发挥它真正的效率 。而多进程就可以很好地解决这个问题 。如果你打开多进程的姿势不对,会导致它比单进程更慢,下面我们就来看看如何正确地打开多进程 。
实验环境
系统:Ubuntu16.04
Python:3.7
示例
这个示例是基于Python对图片做一个预处理
图片预处理
?
读取图片将图片转换为bytes数组
?
采用for循环处理批量图片
这里我们直接通过循环调用图片的预处理函数,其实也就是单进程 。处理了1349张图片 , 一共花了将近10s 。这里我为了方便就没有采用多次调用来取平均值了 , 如果大家想要计算得更加准确,可以采用取平均值 。
?
采用进程池多进程处理图片
?
使用4个进程居然花了将近13s,按道理来说这不科学呀?4个进程的处理速度应该要快于单个进程,现在看来居然还更慢 。也就是说,我们花了更多的硬件资源,居然还花费了更多的时间 。这是为什么呢?
接下来看看 , 我们使用Queue来改进使用多进程对图片进行预处理
?
惊讶地发现,当我们将进程池改为根据进程的个数来分发任务时,居然速度要快将近一倍左右 。
特别注意:这里其实使用多线程来处理会比多进程的速度更快 , 而且消耗的资源也要少点 。举这个例子只是为了说明,影响多进程速度的原因 。
影响进程速度的原因
进程池速度慢可能有下面几个原因:
CPU资源不足,开启更多的进程只会导致速度更慢
进程之间通信传输的数据量大
使用了Lock处理共享的数据
进程使用了大量的os.fork()
在上面的例子中,其实影响多进程速度的主要原因是因为调用preprocess函数每次都会返回一个image array占用的内存比较大 , 如果你将返回值由image array改为一个字符串你会发现最终它们的速度会差不多 。
那为什么使用Queue的速度会比进程池快那么多呢?这里主要也是因为进程池在保存数据与Queue的差异导致的 。
虽然说,我们在使用进程池的时候采用的也是异步调用的方式 。但是,进程池在接受返回结果的时候使用了self.wait(timeout),而进程池最终返回结果的顺序也和调用的时候保持一致 。而Queue在保存数据的时候,会通过后台的线程来写数据,所以它最终保存的结果是乱序的 , 相对来说它的速度会更快点 。
python函数分发的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python 分发包、python函数分发的信息别忘了在本站进行查找喔 。
推荐阅读
- 拍摄前得准备什么,拍摄前需要准备什么
- Fox飞行射击游戏,fox飞行射击游戏有哪些
- sqlserver2012运行慢,sqlserver数据库卡顿
- vb.net时钟延迟的简单介绍
- 液晶广告机如何做营销分析,液晶广告机哪里买好点
- 大众速腾车载电视怎么用,速腾车载怎么看视频
- 钉钉直播课声音延迟正常吗,钉钉直播课声音小怎么回事
- c语言函数实参和形参 c语言函数实参和形参的区别
- GO语言发育商测评推荐,语言发育量表图