python面试知识点二

python知识点二、

进程、线程、协程

进程
进程是资源(cpu、内存、网络、io)分配的最小单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。进程拥有自己独立的内存空间,进程间数据不共享,开销大。
线程
线程是程序执行时的最小单位,它是进程的一个执行流。一个进程可由多个线程组成,线程间共享进程的所有资源,每个线程都有自己的堆栈和局部变量。为了保证数据安全,必须使用线程锁(GIL全局解释器锁和线程锁)
协程
1.协程又称微线程,本质上就是一个单线程。
2.协程能在单线程处理高并发,因为遇到IO自动切换
线程遇到I/O操作会等待、阻塞,协程遇到I/O会自动切换 (剩下的只有CPU操作)
线程的状态保存在CPU的寄存器和栈里而协程拥有自己 的空间,所以无需上下文切换的开销,所以快
3.为甚么协程能够遇到I/O自动切换
greenlet是C语言写的一个模块,遇到IO手动切换
协程有一个gevent模块(封装了greenlet模块),遇到I/O自动切换
4.协程拥有自己的空间,所以无需上下文切换的开销

基于python中staticmethod和classmethod的区别

class A(object):
  def foo(self,x):
    print "executing foo(%s,%s)"%(self,x)
 
  @classmethod
  def class_foo(cls,x):
    print "executing class_foo(%s,%s)"%(cls,x)
 
  @staticmethod
  def static_foo(x):
    print "executing static_foo(%s)"%x  
 
a=A()

上述类有三个函数,使用如下:

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
 
-----------------------------------------------------------------
 
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 
-----------------------------------------------------------------
 
a.static_foo(1)
# executing static_foo(1)
 
A.static_foo('hi')
# executing static_foo(hi)

区别
• foo()的调用者必须是类A的一个实例,class_foo()与static_foo()的调用者既可以是类也可以是某个实例

• 参数不同,foo() 参数为self和其他参数,class_foo()参数使用类(cls)替换了self,static_foo()则只有参数,没有self和类cls

• a.foo(1)中的foo()与实例对象a是绑定的,class_foo()是与类绑定的,而static_foo()与这两者都没有绑定,可以使用print来查看,如下:

print(a.foo)
# <bound method A.foo of <main.A object at 0xb7d52f0c>>
 
print(a.class_foo)
# <bound method type.class_foo of <class 'main.A'>>
 
print A.class_foo
<bound method classobj.class_foo of >
 
print(a.static_foo)
# 
print(A.static_foo)
# 

作用:
• 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数(全局函数),后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

• 有利于组织代码,同时有利于命名空间的整洁

注:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,类方法是该类实例化出来的对象也具有该方法self.xxx。staticmethod一般情况下可以替换为外部的函数(全局函数),后者继承的时候不可更改。

super().get_dict() super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象

python使用pymysql操作数据库,速度太慢,已解决

使用python的pymysql操作数据库使发现,网页的加载速度特别慢,正常加载时间应该是零点几秒,可是用pymysql加载的速度高至十几秒,开始分析时,认为是图片,js,css …内存过大,然后用了“图床”,等技术之后发现没有变化,之后使用了,“删代码排除法”,一点一点的排除,结果发现是操作数据库的方法有问题,通过几小时的查询,发现,python,目前版本,有几种中操作数据库的方法,小编一种一种的尝试发现只要一种之后发现一个结论,和网上说的一样:“在 Python 3.6 下,pymysql 是最慢的,mysqlclient 很快,但是 mysql-connector-python 更快,但是到了 Python 3.7,反而比 pymysql 还慢”,声明:小编使用的是python3.6版本。以下是使用:mysql-connector-python 的一些执行案例:增删改查。

查询:

import mysql.connector
config = {
    'host': '127.0.0.1',
    'user': 'root',
    'password': '123',
    'port': 3306,
    'database': 'movie',
    'charset': 'utf8'
}
try:
    cnn = mysql.connector.connect(**config)
except mysql.connector.Error as e:
    print('connect fails!{}'.format(e))
cursor = cnn.cursor()
try:
    sql_query = 'SELECT `id`,`name`,`img`,`showtime`,`grade` FROM `movies` ORDER BY `updatetime` DESC LIMIT 0,9'
    cursor.execute(sql_query)
    for name in cursor:
        print(name)
except mysql.connector.Error as e:
    print('query error!{}'.format(e))
finally:
    cursor.close()
    cnn.close()
————————————————
版权声明:本文为CSDN博主「程序帝国」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40910788/article/details/84559170

————————————————
版权声明:本文为CSDN博主「程序帝国」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40910788/article/details/84559170

Django模型之内置类Class Meta

Class Meta 作用:使用内部类来提供一些metadata,以下列举一些常用的meta:
1,abstract:如下段代码所示,将abstract设置为True后,CommonInfo无法作为一个普通的Django模型,而是作为一个抽象基类存在,作用 是为其他的类提供一些公有的属性。如Student会拥有三个属性,即name,age,home_group。利于公用信息的分解,避免重复编码。

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

2,db_table:用来指定model对应的数据库中的表名,建议的格式为“this_is_table_name”,即小写加下划线的格式。若不指定也可 以,Django会自动生成相应的表名,但是,自动生成的表名的可读性就不能够保证了。

POP3、SMTP和IMAP之间的区别和联系

POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。用来发送电子邮件的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值