l = [1, 2, 3, 4, 5] product = reduce(lambda x, y: x * y, l) # 1*2*3*4*5 = 120 迭代器和生成器 在 Python 中一切皆对象...LRU cache缓存装饰器,在 Python 中的表示形式是@lru_cache。...通常应用于 I/O 操作频繁的场景,比如从网站上下载多个文件,I/O 操作的时间可能会比 CPU 运行处理的时间长得多。 并行,则是指多个进程同时执行。...如果是 I/O bound,但是 I/O 操作很快,只需要有限数量的任务 / 线程,那么使用多线程就可以了。 如果是 CPU bound,则需要使用多进程来提高程序运行效率。...Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。
,而不是遍历所有元素,这也是Python中list结构的特点:允许对元素进行快速的随机访问(即检索位于特定索引位置的元素); appen在list尾部追加元素,时间复杂度为O(1),同样只需要一步就能在...; iteration迭代list元素,时间复杂度为O(n),也就是遍历list列表中的每一个元素; contains(in)使用in操作符判断元素是否在list列表当中,时间复杂度为O(n),需要遍历一遍...n + k),set slice操作可以分为两个步骤: 先把需要把切片的元素删除掉,就是del slice操作,这个时候时间复杂度为O(n); 然后把需要设置的切片元素补充上,补充的切片有k个元素,时间复杂度为...in)使用in操作符判断元素是否在list列表当中,时间复杂度为O(n),需要遍历一遍list列表才能知道; 二 dict内置操作的时间复杂度 copy操作时间复杂度为O(n),把字典中的所有元素都生成一份...O(1),使用字典可以不用进行遍历,字典中维护着一个键,所以他能一步找到看对应元素是否在dict中; iteration迭代dict操作,时间复杂度为O(n),因为dict是一个可迭代对象,因此可以通过
复杂度分析: 时间复杂度o(N):其中N为字符串s的长度,字符串切片函数为线性时间复杂度; 空间复杂度o(N):两个字符串切片的总长度为N。...复杂度分析: 时间复杂度o(N):线性遍历s并添加,使用线性时间;。...空间复杂度O(N)︰新建的辅助res使用O(N)大小的额外空间 方法三:字符串遍历拼接 若规定Python不能使用join(函数,或规定Java只能用String,则使用此方法。...复杂度分析: 时间复杂度o(N):线性遍历s并添加,使用线性时间; 空间复杂度O(N):假设循环过程中内存会被及时回收,内存中至少同时存在长度为N和N―1的两个字符串(新建长度为N的res需要使用前一个长度...Ⅳ-1的res ) ,因此至少使用O(N)的额外空间。
定义 大O符号,记作O(f(n)),表示随着输入大小n的增加,算法的运行时间或所需空间的增长率与f(n)增长率相同或者更慢。...推导大O阶方法: 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中,只保留最高阶项。 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。...空间复杂度不仅包括在算法执行过程中,输入和输出所占据的空间,还包括算法执行过程中临时占用的额外空间。 空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。...exchange: 用于标记在一次遍历中是否发生了交换,以此判断数组是否已经排序完成。 i: 循环计数器,用于遍历数组中的元素。...无递归调用: 算法不使用递归,因此不会因为递归调用而在栈上占用额外的空间。 无动态内存分配: 算法运行过程中没有使用如 malloc, new 等动态内存分配函数,因此不会在堆上占用额外的空间。
) p.是否存在不可显示的字符 \t:制表符 \n:换行 text = "hdsgjhk\tklj" v = text.isprintable() print(v) q.判断是否全部是空格 text...:当前数字的二进制至少用几位来表示 print (r) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647 在64位系统上...,可以是任意值 i.设置值,已经存在,不设置,获取当前key对应的值 不存在,设置,获取当前key对应的值 (setdefault) dic = { "k1": "v1", "k2":...③:解释器路径 window linux 系统中: D:\python35\python 2.py python 2.py linux系统中: 文件名: ./2.py 文件内部: 解释器路径 #!.../usr/bin/env python 声明当前使用的是哪个Python解释器 编码 # -*- coding:utf8 -*- 告诉python解释器帮我们怎么编码文件 ascill 00000000
下表列出了这些算法对于不同问题规模的运行时间: 输入大小 算法 A 的运行时间 算法 B 的运行时 10 1,001 111 100 10,001 10,101 1,000 100,001 1,001,001...非常大的整数却是个例外;在这种情况下,运行时间随着位数的增加而增加。 索引操作 — 在序列或字典中读写元素 — 的增长级别也是常数级的,和数据结构的大小无关。...当它超出了所占用空间时,它偶尔被拷贝到一个更大的地方,但是对于 n 个运算的整体时间仍为 O(n) , 所以我每个运算的平均时间是 O(1) 。 从一个列表结尾删除一个元素是常数时间。...keys、values 和 items 是常数时间,因为它们返回迭代器。 但是如果你对迭代器进行循环,循环将是线性的。 字典的性能是计算机科学的一个小奇迹之一。...图 a.2:运行时间和n,虚线斜率为 1 图 a.3:运行时间和n,虚线斜率为 2 在图 a.2 中,我用斜率为 1 的直线拟合了曲线。 这条线很好地拟合了数据,所以我们得出结论,这些实现是线性的。
(o) 常见用法 列表常见方法如下图所示, 下面我们对部分用法进行操作 切片操作: # 切片操作 # 类似字符串的切片操作,对于列表的切片操作和字符串类似...# 起始偏移量 小于0 则会当做 0 ,终止偏移量 大于 “长度-1” 会被当成 ”长度-1” print([10, 20, 30, 40][1:30]) 成员资格判断: # 成员资格判断 # 判断列表中是否存在指定的元素...、其他序列类型、迭代器等生成元组 list()可以接收元组、字符串、其他序列类型、迭代器等生成列表 # 元组tuple # 列表属于可变序列,可以任意修改列表中的元素 # 元组属于不可变序列,不能修改元组中的元素...也可以使用生成器对象的 __next__() 方法进行遍历,或者直接作为迭代器对象来使用。...根据键查找“键值对”的底层过程 用法总结: 字典在内存中开销巨大 (空间换时间) 键查询速度很快 (通过位运算+Hash运算) 往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。
查找需要分成两步进行: 计算键值对所在的桶; 在链表上顺序查找,时间复杂度显然和链表的长度成正比。...HashMap 采用动态扩容来根据当前的 N 值来调整 M 值,使得空间效率和时间效率都能得到保证。...HashTable 关键词: Hashtable的迭代器不是 fail-fast,HashMap 的迭代器是 fail-fast 迭代器。...否则,则使用Comparable的compareTo(T o)方法来比较。...值得说明的是:如果使用的是compareTo(T o)方法来比较,key一定是不能为null,并且得实现了Comparable接口的。
二、字符串的运算Python为字符串类型提供了非常丰富的运算符,我们可以使用+运算符来实现字符串的拼接,可以使用*运算符来重复一个字符串的内容,可以使用in和not in来判断一个字符串是否包含另外一个字符串...需要说明的是,因为字符串在计算机内存中也是以二进制形式存在的,那么字符串的大小比较比的是每个字符对应的编码的大小。...print(s1 is s2, s2 is s3) # False True3.成员运算Python中可以用in和not in判断一个字符串中是否存在另外一个字符或字符串,in和not in运算通常称为成员运算...;在Python中,字符串的索引也可以是从-1到-N的整数,其中-1是最后一个字符的索引,而-N则是第一个字符的索引,通常称之为负向索引。...# 7# 从后向前查找字符o出现的位置(相当于最后一次出现)print(s.rfind('o')) # 123.格式化字符串在Python中,字符串类型可以通过center、ljust、rjust
通过本节学习,应掌握以下内容: 了解算法分析的重要性 能够熟练使用大 O O O 表示法分析算法的时间复杂度 掌握空间复杂度分析方法 了解 Python 列表和字典常见操作的时间复杂度 1....在 Python 中,可以使用 time 模块的 time 函数记录程序的开始时间和结束时间,然后计算差值,就可以得到以秒为单位的算法执行时间。...而指数复杂度除了对那些规模特别小的输入,其运行时间都是不现实的,即使立方复杂度和其相比都相形见绌。 3. 算法的存储空间需求分析 在以上内容中讨论的都是代码的时间复杂度。...Python内置数据结构性能分析 由于在之后的学习中,我们需要经常使用列表和字典作为构建其他数据结构的基石,因此了解这些数据结构操作的时间复杂度是必要的。...,用于在测试中使用列表对象 x,这么是为了在一个干净的环境中运行计时测试,以免某些变量以某种意外的方式干扰函数的性能。
(o) 常见用法 列表常见方法如下图所示, 下面我们对部分用法进行操作 切片操作: # 切片操作 # 类似字符串的切片操作,对于列表的切片操作和字符串类似...# 起始偏移量 小于0 则会当做 0 ,终止偏移量 大于 “长度-1” 会被当成 ”长度-1” print([10, 20, 30, 40][1:30]) 成员资格判断: # 成员资格判断 # 判断列表中是否存在指定的元素...、其他序列类型、迭代器等生成元组 list()可以接收元组、字符串、其他序列类型、迭代器等生成列表 # 元组tuple # 列表属于可变序列,可以任意修改列表中的元素 # 元组属于不可变序列,不能修改元组中的元素...也可以使用生成器对象的 __next__() 方法进行遍历,或者直接作为迭代器对象来使用。...流程图如下: 用法总结: 字典在内存中开销巨大 (空间换时间) 键查询速度很快 (通过位运算+Hash运算) 往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。
在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。具体请参看下面HashMap的实现原理,也实现了Fail-Fast机制。...在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。 总结 LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。...迭代器初始化过程中会将这个值赋给迭代器的expectedModCount,在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,马上抛出异常...* 底层实际调用HashMap的containsKey判断是否包含指定key。 * @param o 在此set中的存在已得到测试的元素。...运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。 不同点: 1.
IDEL中启动解释器 PyCharm中启动解释器 点击底部Python Console 缩进 ---- 缩进是Python语言和其他语言非常不一样的地方,Python用缩进(4个空格)来表示程序块...: 使用过滤和映射生成特定要求的列表,语法[ for k in L if ],for k in L是对L列表的循环,if expr2使用expr2对循环的元素k进行过滤,.../ 字典类型 ---- 字典是Python中关联的容器类型,使用大括号{}创建,字典中的元素都是一对,每对包括key和value两部分,key值不能重复。...()返回迭代器对象,keys()返回以key为元素的列表。...不定参数*arg arg实际上是一个元组 参数/ /符号前的参数必须使用默认参数输入方式,不能再带关键字。 /符号后面的参数依然可以使用关键字输入形式。
比如mergeSort(a,0,n-1)运行时间的实际递归式应该是: T(n)={O(1),T(⌈n2⌉)+T(⌊n2⌋)+O(n),当n=1当n>=2T(n)={O(1),当n=1T(⌈n2⌉)+T...遗憾的是并不存在通用的方法来猜测递归式的正确解,需要凭借经验,偶尔还需要创造力。即使猜出了递归式解的渐近界,也有可能在数学归纳证明时莫名其妙的失败。...(n)=Θ(f(n))T(n)=Θ(f(n)) 在使用主定理之前,要比较f(n)和(nlogba)f(n)和(nlogba)的大小,这个大小不是算术意义上的大小比较,而是要在多项式意义上比较...如果f(n)落在这两个间隙中,或者情况3中 正则条件不成立,就不能使用主方法来求递归式。 ...+1)=1时,递归过程结束,这时我们计算如下: 到这里我们知道该算法的时间复杂度为O(n2),上面的计算中,我们可以直接使用无穷等比数列的公式,不用考虑项数i的约束,实际上这两种方法计算的结果是完全等价的
总的来说,在评价算法好坏时,时间和空间复杂度应该放在首位,然后是代码质量和其他方面。而不是单纯看代码是否简洁。 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。...时间复杂度的概念 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。...2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。...另外有些算法的时间复杂度存在最好、平均和最坏情况: 最坏情况:任意输入规模的最大运行次数(上界) 平均情况:任意输入规模的期望运行次数 最好情况:任意输入规模的最小运行次数(下界) 例如:在一个长度为...N数组中搜索一个数据x 最好情况:1次找到 最坏情况:N次找到 平均情况:N/2次找到 在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N) 常见复杂度 常数阶O(
多线程适合那些会花费大量时间在I/O操作上,但没有太多并行计算需求且不需占用太多内存的I/O密集型应用。...Python 3中字典的keys、values、items方法都不再返回list对象,而是返回view object,内置的map、filter等函数也不再返回list对象,而是返回迭代器对象。...点评:池化技术就是一种典型空间换时间的策略,我们使用的数据库连接池、线程池等都是池化技术的应用,Python标准库currrent.futures模块的ThreadPoolExecutor就是线程池的实现...线程池是一种用于减少线程本身创建和销毁造成的开销的技术,属于典型的空间换时间操作。...1 2 扩展:如果不希望代码运行时动态的给对象添加新属性,可以在定义类时使用__slots__魔法。
进程资源的拥有者) 同一个进程下的读多个线程共享内存空间,数据直接访问(数据共享) 为了保证数据安全,必须使用线程锁 GIL全局解释器锁 在python全局解释器下,保证同一时间只有一个线程运行 防止多个线程都修改数据...、阻塞,协程遇到I/O会自动切换(剩下的只有CPU操作) 线程的状态保存在CPU的寄存器和栈里而协程拥有自己的空间,所以无需上下文切换的开销,所以快、 为甚么协程能够遇到I/O自动切换 协程有一个gevent...因为有很多模块在使用I / O操作时Gevent是无法捕获的,所以为了使Gevent能够识别出程序中的I / O操作。 # 2....、在项目里用的不多) 插入日志的时候 redis缓存 为什么使用装饰器 结合应用场景说需求 如何使用装饰器 装饰器求函数运行时间 Python 闭包 当一个嵌套函数在其外部区域引用了一个值时,该嵌套函数就是一个闭包...with(上下文管理) 上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样。 with 语句的目的是简化 try/finally 模式。
随着切片元素的递增,每一次判断元素是否在 map 中,因为 map 的 key 是不确定的类型,会发生变量逃逸,触发堆内存的分配。所以,可预见的是当元素数量增加时,性能差异会越来大。...而且使用指针还有另一个好处,可以直接修改指针对应的结构体的值。 5.4 小结 range 在迭代过程中返回的是元素的拷贝,index 则不存在拷贝。...内存管理 1.使用空结构体节省内存 1.1 不占内存空间 在 Go 中,我们可以使用 unsafe.Sizeof 计算出一个数据类型实例需要占用的字节数。...sliceFibonacci() 函数中定义的局部变量切片逃逸到了堆。 那么多大的变量才算是小变量呢?对 Go 编译器而言,超过一定大小的局部变量将逃逸到堆上,不同的 Go 版本的大小限制可能不一样。...内存开销 空间上,一个 Go 程占用约 2K 的内存,在源码 src/runtime/runtime2.go里面,我们可以找到 Go 程的结构定义type g struct。
有许许多多文章写了 Python 中的许多很酷的特性,例如变量解包、偏函数、枚举可迭代对象,但是关于 Python 还有很多要讨论的话题,因此在本文中,我将尝试展示一些我知道的和在使用的,但很少在其它文章提到过的特性...2、对迭代器切片 如果你尝试直接对迭代器切片,则会得到 TypeError ,提示说该对象不可取下标(not subscriptable),但是有一个简单的解决方案: import itertools...(译注:更多关于迭代器切片的内容,可阅读Python进阶:迭代器与迭代器切片) 3、跳过可迭代对象的开始 有时候你必须处理某些文件,它们以可变数量的不需要的行(例如注释)为开头。...16、使用装饰器缓存函数调用 你是否曾经编写过一种函数,它执行昂贵的 I/O 操作或一些相当慢的递归,而且该函数可能会受益于对其结果进行缓存(存储)?...17、在可迭代对象中查找最频繁出现的元素 在列表中查找最常见的元素是非常常见的任务,你可以使用 for 循环和字典(map),但是这没必要,因为 collections 模块中有 Counter 类:
Python中的映射类型,字典和集合,键值唯一,查找效率高,序列(列表、元祖、字符串)的元素查找时间复杂度是O(n),而字典和集合的查找只需要O(1)。...True) print(result) 例题3:海量数据找出top K的数据# 对于小数据量可以使用排序+切片,而对于海量数据,需要考虑服务器硬件条件。...注意,不要使用双重循环,暴力加和来和target对比,正确的做法是单层循环,然后查找target与当前值的差,是否存在于列表中。...但是由于列表的in查询时间复杂度是O(n),即隐含了一层循环,这样效率其实和双重循环是一样的,都是O(n^2)。...这里就可以使用哈希来优化查询差值是否在列表中操作,将O(n)降为O(1),因此总体的效率就会变成O(n^2)- O(n)。
领取专属 10元无门槛券
手把手带您无忧上云