1. 本人最近学python,刚使用pycharm。为什么代码里的input()运行不下去本人小白
可以的啊 正常运行
2. Python 的 GIL 是什么鬼,多线程性能究竟如何
GIL是什么
首先需要明确的一点是 GIL
并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL
C++,Visual
C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把
GIL 归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL
那么CPython实现中的GIL又是什么呢?GIL全称 Global Interpreter Lock 为了避免误导,我们还是来看一下官方给出的解释:
In CPython, the global interpreter lock, or GIL, is a mutex that
prevents multiple native threads from executing Python bytecodes at
once. This lock is necessary mainly because CPython’s memory management
is not thread-safe. (However, since the GIL exists, other features have
grown to depend on the guarantees that it enforces.)
好吧,是不是看上去很糟糕?一个防止多线程并发执行机器码的一个Mutex,乍一看就是个BUG般存在的全局锁嘛!别急,我们下面慢慢的分析。
为什么会有GIL
由于物理上得限制,各CPU厂商在核心频率上的比赛已经被多核所取代。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。 即使在CPU内部的Cache也不例外 ,为了有效解决多份缓存之间的数据同步时各厂商花费了不少心思,也不可避免的带来了一定的性能损失。
Python当然也逃不开,为了利用多核,Python开始支持多线程。 而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。
慢慢的这种实现方式被发现是蛋疼且低效的。但当大家试图去拆分和去除GIL的时候,发现大量库代码开发者已经重度依赖GIL而非常难以去除了。有多难?做个类比,像MySQL这样的“小项目”为了把Buffer
Pool
Mutex这把大锁拆分成各个小锁也花了从5.5到5.6再到5.7多个大版为期近5年的时间,本且仍在继续。MySQL这个背后有公司支持且有固定开发团队的产品走的如此艰难,那又更何况Python这样核心开发和代码贡献者高度社区化的团队呢?
所以简单的说GIL的存在更多的是历史原因。如果推到重来,多线程的问题依然还是要面对,但是至少会比目前GIL这种方式会更优雅。
GIL的影响
从上文的介绍和官方的定义来看,GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。那么读者就会说了,全局锁只要释放的勤快效率也不会差啊。只要在进行耗时的IO操作的时候,能释放GIL,这样也还是可以提升运行效率的嘛。或者说再差也不会比单线程的效率差吧。理论上是这样,而实际上呢?Python比你想的更糟。
下面我们就对比下Python在多线程和单线程下得效率对比。测试方法很简单,一个循环1亿次的计数器函数。一个通过单线程执行两次,一个多线程执行。最后比较执行总时间。测试环境为双核的Mac
pro。注:为了减少线程库本身性能损耗对测试结果带来的影响,这里单线程的代码同样使用了线程。只是顺序的执行两次,模拟单线程。
顺序执行的单线程(single_thread.py)
#! /usr/bin/python
from threading import Thread
import time
def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True
def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
end_time = time.time()
print("Total time: {}".format(end_time - start_time))
if __name__ == '__main__':
main()
同时执行的两个并发线程(multi_thread.py)
#! /usr/bin/python
from threading import Thread
import time
def my_counter():
i = 0
for _ in range(100000000):
i = i + 1
return True
def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = Thread(target=my_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
end_time = time.time()
print("Total time: {}".format(end_time - start_time))
if __name__ == '__main__':
main()
3. 求解这段Python代码哪里错了
tempstr=input('请输入带符号的温度值:')
iftempstr[-1]in['F','f']:
c=(float(tempstr[0:-1])-32)/1.8
print('转换后的温度是{:.2f}C'.format(c))
eliftempstr[-1]in['C','c']:
f=1.8*float(tempstr[0:-1])+32
print('转换后的温度是{:.2f}F'.format(f))
else:
print('输入格式错误!')
4. python可以爬取什么数据
一、爬取我们所需要的一线链接
channel_extract.py
这里的一线链接也就是我们所说的大类链接:
from bs4 import BeautifulSoupimport requests
start_url = 'http://lz.ganji.com/wu/'host_url = 'http://lz.ganji.com/'def get_channel_urls(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
links = soup.select('.fenlei > dt > a') #print(links)
for link in links:
page_url = host_url + link.get('href')
print(page_url)#get_channel_urls(start_url)channel_urls = '''
http://lz.ganji.com/jiaju/
http://lz.ganji.com/rironghuo/
http://lz.ganji.com/shouji/
http://lz.ganji.com/bangong/
http://lz.ganji.com/nongyongpin/
http://lz.ganji.com/jiadian/
http://lz.ganji.com/ershoubijibendiannao/
http://lz.ganji.com/ruanjiantushu/
http://lz.ganji.com/yingyouyunfu/
http://lz.ganji.com/diannao/
http://lz.ganji.com/xianlipin/
http://lz.ganji.com/fushixiaobaxuemao/
http://lz.ganji.com/meironghuazhuang/
http://lz.ganji.com/shuma/
http://lz.ganji.com/laonianyongpin/
http://lz.ganji.com/xuniwupin/
'''
那么拿我爬取的58同城为例就是爬取了二手市场所有品类的链接,也就是我说的大类链接;
找到这些链接的共同特征,用函数将其输出,并作为多行文本储存起来。
二、获取我们所需要的详情页面的链接和详情信息
page_parsing.py
1、说说我们的数据库:
先看代码:
#引入库文件from bs4 import BeautifulSoupimport requestsimport pymongo #python操作MongoDB的库import reimport time#链接和建立数据库client = pymongo.MongoClient('localhost', 27017)
ceshi = client['ceshi'] #建ceshi数据库ganji_url_list = ceshi['ganji_url_list'] #建立表文件ganji_url_info = ceshi['ganji_url_info']123456789101112
2、判断页面结构是否和我们想要的页面结构相匹配,比如有时候会有404页面;
3、从页面中提取我们想要的链接,也就是每个详情页面的链接;
这里我们要说的是一个方法就是:
item_link = link.get('href').split('?')[0]12
这里的这个link什么类型的,这个get方法又是什么鬼?
后来我发现了这个类型是
<class 'bs4.element.Tab>1
如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么
print soup.p['class']
#['title']12
还可以这样,利用get方法,传入属性的名称,二者是等价的
print soup.p.get('class')#['title']12
下面我来贴上代码:
#爬取所有商品的详情页面链接:def get_type_links(channel, num):
list_view = '{0}o{1}/'.format(channel, str(num)) #print(list_view)
wb_data = requests.get(list_view)
soup = BeautifulSoup(wb_data.text, 'lxml')
linkOn = soup.select('.pageBox') #判断是否为我们所需页面的标志;
#如果爬下来的select链接为这样:div.pageBox > ul > li:nth-child(1) > a > span 这里的:nth-child(1)要删掉
#print(linkOn)
if linkOn:
link = soup.select('.zz > .zz-til > a')
link_2 = soup.select('.js-item > a')
link = link + link_2 #print(len(link))
for linkc in link:
linkc = linkc.get('href')
ganji_url_list.insert_one({'url': linkc})
print(linkc) else:
4、爬取详情页中我们所需要的信息
我来贴一段代码:
#爬取赶集网详情页链接:def get_url_info_ganji(url):
time.sleep(1)
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml') try:
title = soup.select('head > title')[0].text
timec = soup.select('.pr-5')[0].text.strip()
type = soup.select('.det-infor > li > span > a')[0].text
price = soup.select('.det-infor > li > i')[0].text
place = soup.select('.det-infor > li > a')[1:]
placeb = [] for placec in place:
placeb.append(placec.text)
tag = soup.select('.second-dt-bewrite > ul > li')[0].text
tag = ''.join(tag.split()) #print(time.split())
data = { 'url' : url, 'title' : title, 'time' : timec.split(), 'type' : type, 'price' : price, 'place' : placeb, 'new' : tag
}
ganji_url_info.insert_one(data) #向数据库中插入一条数据;
print(data) except IndexError: 21222324252627282930
四、我们的主函数怎么写?
main.py
看代码:
#先从别的文件中引入函数和数据:from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom channel_extract import channel_urls#爬取所有链接的函数:def get_all_links_from(channel):
for i in range(1,100):
get_type_links(channel,i)#后执行这个函数用来爬取所有详情页的文件:if __name__ == '__main__':# pool = Pool()# # pool = Pool()# pool.map(get_url_info_ganji, [url['url'] for url in ganji_url_list.find()])# pool.close()# pool.join()#先执行下面的这个函数,用来爬取所有的链接:if __name__ == '__main__':
pool = Pool()
pool = Pool()
pool.map(get_all_links_from,channel_urls.split())
pool.close()
pool.join()
五、计数程序
count.py
用来显示爬取数据的数目;
import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True: # print(ganji_url_list.find().count())
# time.sleep(5)
print(ganji_url_info.find().count())
time.sleep(5)
5. python 多进程
os.fork()指令会创建另外一个进程,他的输出源也是你的python command line或者其他IDE。所以你会看见2个提示符。另外,IDE要处理那么多输出源,当然会很卡。还有,你连打下3次这个命令,相当于对三个进程都进行了下达指令,所以这时候你的进程数目为8(看不懂的建议看小学数学)。你的各个进程的输出会类似于打架,所以窗口会变得很慢。
建议:用pid来区分各个进程(os.fork()在父进程会返回pid,子进程会返回0),例如:
import os
import time
pid=os.fork()
if pid==0:
time.sleep(0.1);
print "Child."
else:
print "The child's pid is:"+str(pid)
//end
以上代码中子进程我给他暂停0.1秒来防止与父进程的输出“打架”,当然有更好的解决方法,由于字数限制不打出来了,具体就是锁住输出源,通过之后再解锁,可以网络。
点赞、采纳、转发,素质三连,友谊你我他!
6. Drcom校园网用路由器怎样分享给多台设备上网
视地区而定,首先需要智能路由器,刷openwrt或者潘多拉或者石像鬼系统,安装python或者java然后找各个地区学校的drcom破解包运行,还是比较麻烦的,具体情况详询
7. 用英语翻译‘请问‘python’是什么意思。’谢谢了
what ' s the meaning of 'python'?
8. 关于Python的学习
1、Python 介绍
学习一门新的语言之前,首先简单了解下这门语言的背景。Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于 1989 年发明,第一个公开发行版发行于 1991 年。Python 在设计上坚持了清晰划一的风格,这使得 Python 成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。Python 具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
2、Python 技术浪潮
IT行业热门技术,更新换代非常的快,技术的浪潮一波接着一波,最初的浪潮无疑是桌面时代,使用 C# 搭建桌面应用开始崭露头角,MFC 还是计算机科学专业必学会的东西。接着就是以网站搭建为应用的背景,PHP,Ruby 等语言为主的。再到近几年非常火热的以移动开发为应用背景,Java(Android 开发)或者 OC(iOS 开发)语言为主。很明显如今的浪潮就是以大数据和机器学习为应用背景,Python 语言为主。站在风尖浪口,猪都可以飞的起来。抓住这波技术浪潮,对于从事 IT 行业的人员来说有莫大的帮助。
3、Python 学习
学习一项新的技术,起步时最重要的是什么?就是快速入门。学习任何一个学科的知识时,都有一个非常重要的概念:最少必要知识。当需要获得某项技能的时候,一定要想办法在最短的时间里弄清楚都有哪些最少必要知识,然后迅速掌握它们。
对于快速入门 python 来说最少必要知识,有以下几点。
(1) Python 基础语法
找一本浅显易懂,例子比较好的教程,从头到尾看下去。不要看很多本,专注于一本。把里面的例程都手打一遍,搞懂为什么。推荐去看《简明python教程》,非常好的一本 Python 入门书籍。
(2)Python 实际项目
等你对 Python 的语法有了初步的认识,就可以去找些 Python 实际项目来练习。对于任何计算机编程语言来说,以实际项目为出发点,来学习新的技术,是非常高效的学习方式。在练习的过程中你会遇到各种各样的问题:基础的语法问题(关键字不懂的拼写),代码毫无逻辑,自己的思路无法用代码表达出来等等。这时候针对出现的问题,找到对应解决办法,比如,你可以重新查看书本上的知识(关于基础语法问题),可以通过谷歌搜索碰到的编译错误(编辑器提示的错误),学习模仿别人已有的代码(写不出代码)等等。已实际项目来驱动学习,会让你成长非常的快。Python 实际项目网上非常的多,大家可以自己去搜索下。合理利用网络资源,不要意味的只做伸手党。
(3) Python 的学习规划
当你把上面两点做好以后,你就已经入门了 Python,接下来就是规划好自己的以后的学习规划。能找到一个已经会 Python 的人。问他一点学习规划的建议,然后在遇到卡壳的地方找他指点。这样会事半功倍。但是,要学会搜索,学会如何更好地提问,没人会愿意回答显而易见的问题。当然如果你身边没有人会 Python,也可以在网上搜索相应的资料。
Python 可以做的事非常的多,比如:Python 可以做日常任务,比如自动备份你的MP3;可以做网站,很多着名的网站像知乎、YouTube 就是 Python 写的;可以做网络游戏的后台,很多在线游戏的后台都是 Python 开发的。每个人都有自己感兴趣的方向,有的对网站开发比较感兴趣,有的对数据处理感兴趣,有的对后台感兴趣。所以你们可以根据自己感兴趣的方向,网上搜索相关资料,加以深入的学习,规划好自己未来的方向。只要坚持,你就能精通 Python,成为未来抢手的人才。
9. 哪位帮我用python打一下这个代码,我想看一下结果,在图书馆没带电脑,谢谢
代码呢?贴出来