2016 - 2024

感恩一路有你

java回调函数的使用场景 为什么Python工程师很少像Java工程师那样讨论垃圾回收?

浏览量:2842 时间:2023-07-02 07:12:50 作者:采采

为什么Python工程师很少像Java工程师那样讨论垃圾回收?

如何管理白记忆中的杜?

Python中主要有三种内存管理机制:引用计数zhi机制、垃圾收集dao机制和内存池机制。

A.引用计数

当一个对象被赋予一个新的名字或被放入一个容器(列表、元组或字典)时,该对象的引用计数将增加。

当del用于表示一个对象被销毁或者引用超过动作或者被重新分配时,该对象的引用计数将会减少。

您可以使用()函数来获取对象的当前引用计数。在大多数情况下,引用计数比我们猜测的要大得多。对于不可变的数据(数字和字符串),解释器会在程序的不同部分共享内存以节省内存。

B.碎片帐集

当对象的引用计数归零时,它将被垃圾收集机制处理掉。

当...的时候

当两个对象A和B相互引用时,del语句可以减少A和B的引用计数,并销毁用于引用底层对象的名称。但是,由于每个对象都包含对其他对象的应用程序,因此引用

计数不会归零,对象也不会被销毁。(导致内存泄漏)。为了解决这个问题,解释器将定期执行循环检测器来搜索不可访问对象的循环并删除它们。

C.内存池机制

Python为内存提供了垃圾收集机制,但是它将未使用的内存放入内存池,而不是返回给操作系统。

1)Pymalloc机制。为了加快Python的执行效率,Python引入了内存池机制来管理小块内存的申请和释放。

2)Python中所有小于256字节的对象都使用pymalloc实现的分配器,而大型对象使用系统的malloc。

3) Python对象,比如整数、浮点数、List,都有自己的私有内存池,对象不共享自己的内存池。也就是说,如果你分配释放了大量的整数,那么用来缓存这些整数的内存就不能再分配给浮点数了。

【Python环境】12个Python面试问题汇总

2.什么是lambda函数?它有什么好处?

Lambda表达式通常在你需要一个函数的时候使用,但是你不需要。;t不想费事给它起名字,就是匿名函数。

Lambda函数:主要目的是指出短回调函数。

lambda[参数]:表达式

gtgtgt alambda x,y:x y

gtgtgt a(3,11)

3.如何在Python中实现元组和列表的转换?

直接用tuple和list函数就行了,type()可以确定对象的类型。

4.请写一个Python代码实现。删除列表中的重复元素。

这个地方可以用set来实现。

5.如何在Python中复制一个对象?(赋值、浅拷贝和深拷贝的区别)

赋值()是创建一个对象的新引用,修改任何一个变量都会影响到另一个。

浅拷贝:创建一个新的对象,但是它包含了对原对象所包含的项的引用(如果引用修改了一个对象,那么另一个对象也会被修改改变){1、全切片法;2、工厂函数,比如list();3、复制模块的copy()函数}

深层复制:新建一个对象,递归复制它包含的对象(修改一个,另一个不变){()复制模块的函数}

6.介绍except的用法和作用?

尝试…除了…除了…[其他…][最后…]

执行try下的语句,如果抛出异常,执行会跳转到except语句。尝试按顺序执行except中的每个分支,如果抛出的异常与except中的异常组匹配,则执行相应的语句。如果所有异常都不匹配,异常将被传递给调用此代码的下一个最高级别的try代码。

如果try下的语句正常执行,则执行else块代码。如果出现异常,将不会执行。

如果finally语句存在,它最终将总是被执行。

【Python环境】12个Python面试问题汇总

7.什么?;Python中match()和search()的区别是什么?

re模块中的Match(pattern,string [,flags]),并检查字符串的开头是否与模式匹配。

在re模块中,research(pattern,string [,flags])在string中搜索模式的第一个匹配值。

gtgtgt print((;超级;,;迷信;)。span())

(0, 5)

gtgtgt print((;超级;,;无法超越;))

没有人

gtgtgt print((;超级;,;迷信;)。span())

(0, 5)

gtgtgt print((;超级;,;无法超越;)。span())

(2, 7)

8.用Python匹配HTML标签时,lt.*gt和lt.*?什么?;gt的区别是什么?

这些术语称为贪婪匹配(lt.*gt)和非贪婪匹配(lt.*?gt)

例如:

试验

lt.*gt:

试验

lt。*?gt:

9.以下代码的输出会是什么?说出你的答案并解释。

输出:

让你不解或惊讶的是,最后一行的输出是3 ^ 2 ^ 3而不是3 ^ 2 ^ 1。为什么改变Parent.x的值会改变Child2.x的值,但同时Child1.x的值不变?

这个答案的关键是在Python中

类变量在内部被视为字典。如果在当前类的字典中没有找到变量名,将搜索祖先类(如父类),直到找到被引用的变量名(如果被引用的变量名

变量名在其自己的类或其祖先类中找不到,这将引发AttributeError异常)。

因此,在父类中设置x 1将使对该类及其任何子类的引用中的类变量x 1的值。这是因为第一个print语句的输出是1 1 1。

随后,如果它的任何子类重写了该值(例如,我们执行语句Child1.x 2),那么该值只在子类中发生变化。这就是为什么第二个print语句的输出是1 2 1。

最后,如果父类中的值发生变化(例如,我们执行语句Parent.x 3),这种变化将影响任何没有覆盖该值的子类中的值(在本例中,受影响的子类是Child2)。这就是为什么第三次打印输出是3 2 3。

10.下面的代码会输出什么?

回答

上述代码将输出[],并且不会导致Ind

什么是线程池,如何使用,为什么要用?

首先,线程池的作用:

线程池的作用是限制系统中执行线程的数量。

根据系统的环境,可以自动或手动设置线程数量,以达到最佳运行效果;少了浪费系统资源,多了造成系统拥塞,效率低下。使用线程池控制线程数量,其他线程排队等待。在一个任务被执行后,从队列中取出前面的任务并开始执行。如果队列中没有正在等待的进程,那么线程池的这个资源正在等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行;否则,进入等待队列。

二、如何使用:

配置一个线程池比较复杂,尤其是如果不清楚线程池的原理,很有可能配置的线程池不是最优的,所以在Executors类中提供了一些静态工厂来生成一些常用的线程池。

创建单线程线程池。这个线程池中只有一个线程在工作,相当于单个线程串行执行所有任务。如果这个唯一的线程由于异常而结束,一个新的线程将取代它。这个线程池确保所有任务按照提交的顺序执行。

创建一个固定大小的线程池。每次提交任务时创建一个线程,直到线程达到线程池的最大大小。一旦线程池的大小达到最大值,它将保持不变。如果一个线程由于执行异常而结束,线程池将被一个新线程补充。

1.创建和销毁线程的数量减少了,每个工作线程可以重用来执行多个任务。2.根据系统 s的承载能力,可以调整线程池中工作线程的数量,防止服务器因内存消耗过大而耗尽(每个线程需要1MB左右的内存,打开的线程越多,消耗的内存越多,最后崩溃)。

Java中线程池的顶层接口是Executor,但严格来说Executor并不是线程池,只是一个执行线程的工具。真正的线程池接口是ExecutorService。

对象 Python 内存 函数 机制

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。