vlambda博客
学习文章列表

插入排序、协程与线程的区别、性能测试常用指标、在线sql

1、插入排序

def insertion_sort(arr):

    """插入排序"""

    # 第一层for表示循环插入的遍数

    for i in range(1, len(arr)):

        # 设置当前需要插入的元素

        current = arr[i]

        # 与当前元素比较的比较元素

        pre_index = i - 1

        while pre_index >= 0 and arr[pre_index] > current:

            # 当比较元素大于当前元素则把比较元素后移

            arr[pre_index + 1] = arr[pre_index]


            # 往前选择下一个比较元素

            pre_index -= 1

        # 当比较元素小于当前元素,则将当前元素插入在 其后面

        arr[pre_index + 1] = current


    print(arr)


insertion_sort([12, 11, 22, 3, 33, 6, 39, 8, 33, 66, 9, 77, 63, 99])


2、协程与线程的区别:

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。


2) 线程进程都是同步机制,而协程则是异步。


3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。


4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。


5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。


6)线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。


3、匹配

import re 

str1 = "Python's features" 

str2 = re.match( r'(.*)on(.*?) .*', str1, re.M|re.I)

print str2.group(1)

有几个()就有几个group

group(0) = group() = Python's features 

第一个()=group(1)

第二个()=group(2)

.*适配所有

?到后面的空格为止

多个标志可以通过按位 OR(|) 来指定

re.M:多行匹配,影响 ^ 和 $

re.I:使匹配对大小写不敏感

分组:即用圆括号将要提取的数据包住,通过 .group()获取,一般和“|”结合使用

re.match( r'(.*)on(.*?) .*', str1, re.M|re.I),将on左边和右边分组

4、性能测试常用指标:

从外部看,主要有


1、吞吐量:每秒钟系统能够处理的请求数,任务数


2、响应时间:服务处理一个请求或一个任务的耗时


3、错误率:一批请求中结果出错的请求所占比例


从服务器的角度看,性能测试关注CPU,内存,服务器负载,网络,磁盘IO

5、sql重复记录查询

select count(*),name from  testzq group by name having count(*)>1

6、在线sql

https://rextester.com/l/sql_server_online_compiler (这个强大,可选SQL Server或MySQL等,但好像只能查询)


https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in (这个看起来是sqlite,支持创建表格、insert)