通过Python有效导入、存储和操作内存数据的技巧 数据来源:文档、图像、声音、数值等等,将所有的数据简单的看做数字数组 非常有助于 理解和处理数据 不管数据是何种形式,第一步都是 将这些数据转换成 数值形式 的可分析数据。
Numpy Numerical Python 的简称, Numpy 数组和python内置的列表类型 非常相似,随着数组在维度上的变大,Numpy数组更高效 导入numpy import numpy as np 理解Python中的数据类型 python易用之处在于动态输入,不需要声明变量类型,是动态推断的。可以将任何类型的数据指定给任何变量 事实就是:Python变量不仅是他们的值,还包括了值得类型 的一些额外信息, 1)python的整型不仅仅是一个整型 标准的Python都是C语言编写的,每一个对象都是一个聪明的伪C语言结构体。该结构体包含其 值还有其他信息, 比如 x = 10000, x是一个指针,指向一个C语言的复合结构体。 查看 c语言 python安装目录\include\longintrepr.h struct _longobject { PyObject_VAR_HEAD digit ob_digit[1]; }; 扩展之后
struct _longobject { long ob_refcnt; PyTypeObject *ob_type; size_t ob_size; long ob_digit[1]; } ob_refcnt: 是一个引用计数,帮助python内存分配 回收 ob_type: 变量的类型编码 ob_size: 数据成员的大小 ob_digit: python变量表示的实际整型值 因为python的动态类型特性,可以创建一个异构的列表 L = [ True, 2, 3.
MySQL 8支持公用表表达式,包括非递归和递归两种。
公用表表达式允许使用命名的临时结果集,这是通过允许在SELECT语句和某些其他语句前面使用WITH子句来实现的。
不能在同一查询中两次引用派生表(子查询),因为那样的话,查询会根据派生表的引用次数计算两次或多次,这会引发严重的性能问题。使用CTE后,子查询只会计算一次。
非递归CTE 1. 派生表(子查询) select …… from (subquery) as derived, table_name ……; 2. CTE with derived as ( subquery ) select …… from derived, table_name ……; CTE可能在SELECT/UPDATE/DELETE之前,包括with derived as (subquery)的子查询,例如:
with derived as ( subquery ) delete from table_name where table_name.col_name in ( select col_name from derived ); CTE可以引用其他CTE with derived_one as ( subquery ), derived_two as ( select …… from derived_one ) select …… from derived_one, derived_two ……; 递归CTE 1.
1.链接本机,端口号默认6379 [root@centos8 ~]# redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> 2.链接本机,端口号不是6379,而是6380 [root@centos8 ~]# redis-cli -p 6380 127.0.0.1:6380> ping PONG 127.0.0.1:6380> 3.链接其他服务器 [root@centos8 ~]# redis-cli -h 192.168.41.132 -p 6380 192.168.41.132:6380> ping PONG 192.168.41.132:6380> 直接使用这种方式链接,是连接不上的
[root@centos8 ~]# redis-cli -h 192.168.41.132 -p 6380 Could not connect to Redis at 192.168.41.132:6380: Connection refused not connected> 究其原因:
redis.conf文件中配置了访问限制,通过bind来限制了ip访问,默认为127.0.0.1
注释掉bind之后,本地可以通过ip访问,但是其他主机无法访问,在redis3之后,有一个protected-mode 参数,默认开启 yes
需要添加参数 requirepass abc (密码),或将protected-mode 修改为no。重启redis服务即可
当开启密码验证时,使用 redis-cli 需要 增加参数 -a pass
5.10 双指针算法
一般都是先有暴力直接解法的情况下进行优化,最常用的有滑动窗口,将字符串换行,将原来o(n2)的复杂度降为o(n);
特别注意:这里的双指针一般是有序的,而且存在单调性;如果没有序,建议先sort,
双指针分为两种情况:两条路径,还有一条路径对碰指针;
例题 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式 第一行包含整数 n。
第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。
输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
输入样例: 5 1 2 2 3 5 输出样例: 3 这是典型的双指针;首先它是有序的,其次,找出不连续的长度,可以先通过暴力来两次循环找到,然后这里就可以优化;
#include iostream using namespace std; const int N = 1e6 + 10; int a[N], s[N]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } int res = 0; for (int i = 0, j = 0; i < n; i++) { s[a[i]]++;//每次将a[i]的位置的值记录,这里也可也通过hash表记录 while (i < n && s[a[i]] > 1) { //当a[i]记录的值出现相同的时候,就需要对其前面的数进行清零 s[a[j]]--; //一直清零到当前a[i]的值只有一个,同时还是连续的; j++; } //在这个循环这边其实就出现了双指针模型的标准模板 res = max(res,i-j + 1); //每次进行遍历的时候,就需要将i与j的位置比较,并且更新结果 } cout << res << endl; return 0; } 对一句话中的空格位置进行换行
下载最新稳定版 wget -O node-linux-x64.tar.xz https://cdn.npmmirror.com/binaries/node/v16.15.0/node-v16.15.0-linux-x64.tar.xz
解压 tar -xvf node-linux-x64.tar.xz
移动到/usr/local目录 mv node-v16.15.0-linux-x64/ /usr/local/nodejs
通过建立软链接的方式设置为全局 ln -s /usr/local/nodejs/bin/node /usr/local/bin/ ln -s /usr/local/nodejs/bin/npm /usr/local/bin/
查看版本 node -v
切换淘宝镜像源 npm config set registry https://registry.npm.taobao.org
目录redis介绍安装rediswindows下安装Linux下安装redis远程连接php链接redisredis的几种数据类型string字符串php操作string类型list(链表)php操作list类型hash(哈希类型)hash相关操作命令set(集合)set与list的区别set相关操作命令zset(sorted set --有序集合)zset相关操作命令redis其他操作在php开发或生产中推荐关于redis扩展参考资料
redis 介绍 redis是一个key-value存储系统。
它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。
为了保证效率,数据都是缓存在内存中
安装redis windows下安装 https://github.com/dmajkic/redis/downloads。
下载对应的压缩包后解压出来,注意路径中最好不要有中文,解压后如下图
通过命令行打开redis
1.进入redis 2.打开redis的服务端命令行 3.打开客户端命令行 4.设置和获取键值对,测试redis是否能正常运行 Linux下安装 cd /opt wget https://github.com/antirez/redis/archive/5.0.7.tar.gz tar -zxvf redis-5.0.7.tar.gz mv redis-5.0.7 /usr/local/redis cd /usr/local/redis make && make PREFIX=/usr/local/redis install redis远程连接 修改redis.conf文件
1.注释掉bind 127.0.0.1 2设置后台启动,将 daemonize no 改为 daemonize yes 3.protected-mode no #默认yes,开启保护模式,限制为本地访问 php链接redis 下载redis扩展,官网地址(https://pecl.php.net/package/redis)
cd /opt wget https://pecl.php.net/get/redis-5.3.7.tgz tar -zxvf redis-5.3.7.tgz mv redis-5.3.7 /usr/local/php_extension/redis cd /usr/local/php_extension/redis phpize .
一、运算符
1.算数运算
a、+、-、*、/(加减乘除)
print(10+2) #运算符+(加)print(10-2) #运算符-(减)print(10*2) #运算符*(乘)print(10/3) #运算符/(除) b、//(取整)
print(10//3) #运算符//(取整) c、%(取余/取模)
print(10%3) #运算符%(取余/取模) d、**(幂运算)
print(2**3) #运算符**(幂函数)2的3次方 2.赋值运算
a、=(赋值)
str_01=helloprint(str_01) #赋值运算=(赋值) b、+=、-=、*=、/=
num=1num2=num+1 #加,与下面同一种表达作用num +=1 #+=(加)、-=(减) 3.比较运算符 > 、<、>=、<=、==、!=(大于、小于、大于等于、小于等于、等于、不等于)
返回的是布尔值(False、True)
print(1>2) #比较运算符>(大于),返回布尔值(true/false)print(1<2) #比较运算符<(小于),返回布尔值(true/false)print(1>=2) #比较运算符>=(大于等于),返回布尔值(true/false)print(1<=2) #比较运算符<=(小于等于),返回布尔值(true/false)print(1!=2) #比较运算符!=(不等于),返回布尔值(true/false)print(1==2) #比较运算符==(等于),返回布尔值(true/false) 4.逻辑运算符 a、and(与) b、or(或) c、!(非)
num=10num2=20print(num !=0) #逻辑运算符!(非),返回布尔值(true/false)print(num==10 and num2==10) #逻辑运算符and(与),判断num是否等于10,判断num2是否等于10,当2个同时为真,则返回true,否则返回falseprint(num==10 or num2==10) #逻辑运算符or(或),多个条件只要有一个条件为真,则返回true,否则返回false二、字符串 1.定义:单引号、双引号、三单引号、三双引号(’ ‘、 “ “、‘’‘ ’‘’、“”“ ”“”) 加上引号类型就是字符串(数值)
str_01='hello'str_02=hello pythonstr_04=test python 类型转换:str(object)
一、线程的创建
【1】threading.Thread创建一个线程,返回一个对象,用变量接收
【2】变量.start启动线程
# -*- coding:utf-8 -*- # __author__: # 2022/5/10 # GIL:全局解释器锁,只允许 同一时间只允许1个线程进入CPU,所以cpython中没有并行,是并发 import threading,time def foo(st): for i in range(5): time.sleep(1) print(st) # 1、threading.Thread创建一个线程,返回一个对象 # 2、args入参是个元祖,所以括号最后要加上逗号;入参即foo函数的入参 # 3、target是目标函数 t1 = threading.Thread(target=foo,args=('消费数据1',)) t2 = threading.Thread(target=foo,args=('消费数据2',)) # 启动线程 t1.start() t2.start() 【3】以上代码最终结果是, '消费数据1'和'消费数据2'和换行符,并发进行,执行完后结束
二、阻塞线程join
【1】join阻塞父线程:在子线程没有执行完成之前,阻塞父线程;当子线程全都执行完成后,继续执行父线程
# -*- coding:utf-8 -*- # __author__: # 2022/5/10 import threading def foo(st): for i in range(5): print(st) t1 = threading.Thread(target=foo,args=('生产数据1',)) t2 = threading.Thread(target=foo,args=('生产数据2',)) t1.start() t2.start() # join阻塞父线程:在子线程没有执行完成之前,阻塞父线程;当子线程全都执行完成后,继续执行父线程 # 运行.
docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7.19
Cent OS最小安装在默认状态下使用NetworkManager这个服务来控制联网,但是这个配置在配置生产环境服务器时一般不会使用,而是使用系统自带的network服务,更加稳定,因此先将NetworkManager服务关闭,命令是:
systemctl stop NetworkManager systemctl disable NetworkManager 关闭以后,我们来编辑network服务的配置文件,默认路径是/etc/sysconfig/network-scripts/ifcfg-ensXX。这里XX指的是服务器网卡编号,我这里是33,于是命令就是:
vi /etc/sysconfig/network-scripts/ifcfg-ens33 这里的配置文件按照自己的实际环境(子网地址、子网掩码和网关)进行配置。例如我这里的Cent OS是VMWare当中虚拟机,我在VMWare创建的虚拟网卡vmnet8的子网地址是192.168.131.0、子网掩码是255.255.255.0和网关是192.168.131.254,那么就按照这些参数对配置文件进行修改。
配置文件未修改是这样的:
配置文件修改后是这样:
可以看到,主要改了以下几项:
BOOTPROTO=static # 将IP地址的分配方式设置为静态 IPADDR=192.168.131.131 # 配置一个具体的静态IP,依照子网地址进行分配 NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.131.254 # 网关 DNS1=8.8.8.8 # 连接外网时解析域名使用 修改完保存退出,然后重启网络服务:
systemctl restart network 或者 service network restart 过一小会儿再通过命令ifconfig查看自己的IP地址,就是自己配置的IP了。