Myluzh Blog

Python numpy中ndarray与原生list对比

2023-7-13 myluzh Python

0x01 ndarray与list运行时长对比

import random
import numpy as np
import timeit

a = []
for i in range(100000000):
    a.append(random.random())

def sum_list():
    return sum(a)
def sum_numpy():
    b = np.array(a)
    return np.sum(b)

time_list = timeit.timeit(sum_list, number=1)
time_numpy = timeit.timeit(sum_numpy, number=1)

print("List sum time:", time_list)
print("Numpy sum time:", time_numpy)

List sum time: 6.816154757

Numpy sum time: 4.999972694



0x02 ndarray的优势



WechatIMG3698.png

(1)ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndaray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Pvthon原生list简单的多。

(2)ndarray支持并行化运算 (向量化运算):numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。

(3)效率远高于纯Python代码:Numpy底层使用C语言编写,内部解除了GIL (全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯python代码。

标签: numpy ndarray

评论(0) (395)

Python matplotlib 绘制散点图/柱状图

2023-7-13 myluzh Python

0x01 散点图

WechatIMG13050.jpeg

import matplotlib.pyplot as plt
import random

# 生成数据
num_points = 1000
x = [random.uniform(0, 10) for i in range(1000)]
y = [random.uniform(0, 10) for i in range(1000)]

# 绘制散点图
plt.scatter(x, y, s=5, alpha=0.5)

# 添加标题和标签
plt.title('Scatter Plot Example')
plt.xlabel('X')
plt.ylabel('Y')
# 显示图形
plt.show()



0x02 柱状图


柱状图.jpeg

import matplotlib.pyplot as plt

# 柱状图的数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [15, 25, 10, 20, 30]

# 创建一个新的图形
fig, ax = plt.subplots()

# 绘制柱状图
ax.bar(categories, values)

# 设置图形的标签和标题
ax.set_xlabel('Categories')
ax.set_ylabel('Values')
ax.set_title('Bar Chart Example')

# 显示图形
plt.show()



0x03 其他

其他示例可以参考官网

https://matplotlib.org/stable/plot_types/basic/index.html

标签: python matplotlib 散点图 柱状图

评论(0) (796)

Python matplotlib 绘制折线图(多坐标系)

2023-7-13 myluzh Python

0x01 图像

点击查看原图

0x02 代码

import matplotlib.pyplot as plt
import random
# 支持中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']
mpl.rcParams['axes.unicode_minus'] = False  # 用来解决不能使用汉字问题,需要导入matplotlib
# 准备x y 数据
x = range(1, 31)
y_hangzhou = [random.uniform(35, 42) for i in x]
y_beijing = [random.uniform(34, 39) for i in x]
# nrows/ncols设置成有几行几列的坐标系。返回fig:图对象,axes:返回相应数量的坐标系
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=50)
axes[0].plot(x, y_hangzhou, color="b", linestyle='-', label='上海')
axes[1].plot(x, y_beijing, color="r", linestyle='--', label='北京')
# 刻度显示 自定义x y 刻度
# 构造xy刻度标签
x_ticks = ([f"6月{i}日" for i in x])
y_ticks = range(45)
axes[0].set_title('上海30天气温', fontsize=20)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_xticks(x[::4], x_ticks[::4])
axes[0].set_yticks(y_ticks[30::2])
axes[1].set_title('北京30天气温', fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_xticks(x[::4], x_ticks[::4])
axes[1].set_yticks(y_ticks[30::2])
# 添加网格显示
axes[0].grid(True, alpha=0.5, linestyle="--")
axes[1].grid(True, alpha=0.5, linestyle="-")
# 添加图例
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 显示
plt.show()


标签: python matplotlib

评论(0) (453)

Python matplotlib 绘制折线图(单坐标系)

2023-7-13 myluzh Python

0x01 图像

点击查看原图

0x02 代码

import matplotlib.pyplot as plt
import random
# 支持中文
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']
mpl.rcParams['axes.unicode_minus'] = False  # 用来解决不能使用汉字问题,需要导入matplotlib
# 准备x y 数据
x = range(1, 31)
y_hangzhou = [random.uniform(35, 42) for i in x]
y_beijing = [random.uniform(34, 39) for i in x]
# 创建画布
plt.figure(figsize=(10, 5), dpi=70)
# 绘制图像
plt.plot(x, y_hangzhou, color="b", linestyle='-', label='上海')
plt.plot(x, y_beijing, color="r", linestyle='--', label='北京')
# 如果只在plt.plot中设置label还不能最终显示出图例,还需要通过plt.legend将图例显示出来
plt.legend(loc='best')#best是最佳方式显示
# 自定义x y 刻度
x_ticks = ([f"6月{i}日" for i in x])
y_ticks = range(45)
plt.xticks(x[::2], x_ticks[::2])
plt.yticks(y_ticks[35::2])  # 从35开始 每次::2
# 自定义网格
plt.grid(True, linestyle="--", alpha=0.5)
# 定义标题跟x_lable跟y_lable
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("最近1个月的温度", fontsize=15)
# 保存图片 要在show()前面,因为show后会释放figure
plt.savefig("a.png")
# 显示图像
plt.show()

标签: python matplotlib

评论(0) (423)

Python selenium WebDriver 参数

2023-7-6 myluzh Python

设置 WebDriver 的选项参数可以使用 Options 类,具体如下所示:

from selenium import webdriver from selenium.webdriver.chrome.options import Options # 创建 ChromeOptions 实例 options = Options() # 设置选项参数 options.add_argument("--headless") # 无界面模式运行 options.add_argument("--disable-gpu") # 禁用GPU加速 options.add_argument("--window-size=1920,1080") # 设置窗口大小 # 创建 Chrome 浏览器实例,并传入选项参数 driver = webdriver.Chrome(options=options) 

其中,add_argument() 方法用于添加选项参数。你可以根据需要选择适合的选项参数来配置你的 WebDriver 实例。常见的选项参数包括:

  • --headless:启用无界面模式运行浏览器。
  • --disable-gpu:禁用 GPU 加速。
  • --window-size=width,height:设置浏览器窗口大小,单位为像素。
  • --user-agent="user_agent_string":设置用户代理(User-Agent)字符串。
  • --proxy-server=host:port:设置代理服务器地址和端口。

你可以根据具体需求自行添加和配置选项参数。



以下是一些常用的 WebDriver 选项参数及其说明:

  • --headless:以无界面模式运行浏览器。
  • --disable-gpu:禁用 GPU 加速。
  • --window-size=width,height:设置浏览器窗口的宽度和高度。
  • --start-maximized:启动浏览器时最大化窗口。
  • --user-agent="user_agent_string":设置浏览器的用户代理(User-Agent)字符串。
  • --proxy-server=host:port:设置代理服务器地址和端口。
  • --ignore-certificate-errors:忽略证书错误。
  • --disable-extensions:禁用浏览器扩展。
  • --incognito:以隐身模式启动浏览器。
  • --disable-notifications:禁用浏览器通知。
  • --disable-infobars:禁用浏览器的信息栏。
  • --disable-popup-blocking:禁用弹出窗口阻止。

这些选项参数可以根据具体需求来进行配置。你可以根据自己的情况选择适合的选项参数来定制你的 WebDriver 实例。

标签: python selenium WebDriver

评论(0) (497)

Python selenium在Chrome中设置传感器(位置)

2023-5-25 myluzh Python

是否可以使用 Chrome Headless 设置自定义位置坐标?我在里面找不到。

Is it possible to set custom location coordinates with Chrome Headless? I can't find it in the Devtools protocol API. Is there a workaround available?

解决方案

I googled it and got many methods. I try one by one, almost all of them turn out outdated. Then I find out a solution, use chrome devtools protocol to achieve that.

The small example code below, that it uses the most common tool selenium to execute chrome devtools protocol command.

import time

from selenium.webdriver import Chrome, ChromeOptions

options = ChromeOptions()
options.add_argument("--headless")
driver = Chrome(options=options)
driver.execute_cdp_cmd(
    "Browser.grantPermissions",
    {
        "origin": "https://www.openstreetmap.org/",
        "permissions": ["geolocation"]
    },
)
driver.execute_cdp_cmd(
    "Emulation.setGeolocationOverride",
    {
        "latitude": 35.689487,
        "longitude": 139.691706,
        "accuracy": 100,
    },
)
driver.get("https://www.openstreetmap.org/")
driver.find_element_by_xpath("//span[@class='icon geolocate']").click()
time.sleep(3)  # wait for the page full loaded
driver.get_screenshot_as_file("screenshot.png")

标签: selenium Chrome 传感器 位置 虚拟定位

评论(0) (646)

Django-Form与ModelForm

2023-5-24 myluzh Python

0x01 原始的Form表单

用户提交数据没有校验。

页面上没有错误提示。

页面上每个字段都要写一遍。

关联的数据还需要手动获取后循环展示在页面中。



0x02 Django组件-Form

views.py

from django.forms import Form
class MyForm(Form):
    user = forms.CharField(widget=forms.Input)
    pwd = form.CharFiled(widget=forms.Input)
    email = form.CharFiled(widget=forms.Input)

def user_add(request):
    if request.method == "GET":
        form = MyForm()
        return render(request, 'user_add.html', {"form": form})

user_add.html

<form method="post">
    <!--以前的写法写input,比较麻烦-->
    <input type="text" class="form-control" placeholder="用户名" name="user">

    <!--使用Form组件后现在的写法-->
    {{ form.user }}
    {{ form.pwd }}
    {{ form.email }}

    <!--或者直接for循环循环输出也是可以的-->
    {% for field in form%}
        {{ field }}
    {% endfor %}
</form>



0x03 Djanfo组件-ModelForm

models.py

class UserInfo(models.Model):
    """员工表"""
    name = models.CharField(verbose_name="名称", max_length=16)
    password = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name="年龄")
    wallet = models.DecimalField(verbose_name="钱包余额",max_digits=10, decimal_places=2, default=0)
    create_time = models.TimeField(verbose_name="创建时间", )
    depart = models.ForeignKey(verbose_name="部门", to="Department",to_field="id", on_delete=models.SET_NULL,null=True, blank=True, )
    gender_choices = (
        (0, "未知"),
        (1, "男"),
        (2, "女"),
    )
    gender = models.SmallIntegerField(verbose_name="性别",choices=gender_choices)

views.py

# 首先导入ModelForm
from django.forms import ModelForm

"""
在视图函数中定义一个类,比如就叫MyForm,这个类要继承ModelForm。
在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)
"""
class MyForm(ModelForm):
    class Meta:
        # 对应APP应用中的Model中的类
        model = day16.models.UserInfo
        # Model中的类里面声明的字段,也可以直接使用fields="__all__"列出所有字段
        fields = ["name", "password", "age"]

def user_add(request):
    if request.method == "GET":
        form = MyForm()
        return render(request, 'user_add.html', {"form": form})

user_add.html

html用法跟上面的Form中讲的一样。

标签: django

评论(0) (469)

python调用OPENAI_ChatGPT类

2023-5-24 myluzh Python

0x01 前言

python有直接现成的OPENAI模块,为了锻炼下自己,写了个基础的调用类。

0x02 代码

需要更改成你自己的open_ai_key,还有就是要设置下http代理,因为目前GPT只能国外访问。

class OPENAI:
    def __init__(self):
        self.open_ai_key = "sk-DR5GkhpENIwerq9qfmYqT3BlbkFJXeWBFt4melgpmv8PFr"
        self.open_ai_api = "https://api.openai.com/v1/chat/completions"
        self.model = "gpt-3.5-turbo-0301"

    def openai_reply_requests(self, message):
        error_counter = 0
        while error_counter <= 3:
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {self.open_ai_key}",
            }
            parameters = {
                "model": self.model,
                "messages": message,
            }
            try:
                proxies = {"http": "http://user:password@43.134.241.127:1080"}
                rqq = requests.post(headers=headers, url=self.open_ai_api, json=parameters, timeout=(5, 20),proxies=proxies)
            except requests.exceptions.ConnectTimeout and requests.exceptions.ReadTimeout as e:
                print(f"ConnectionError:{e} ")
                return f"连接超时,请重试。"
            rqq = json.loads(rqq.text)
            print(rqq)
            print(f"API请求长度:{len(parameters['messages'])} 附带参数{parameters['messages']}")
            try:
                return rqq['choices'][0]['message']['content']
            except KeyError as e:
                print(f"KeyError:{e},rqq:{rqq['error']['message']}")
                if "Rate limit reached" in rqq['error']['message']:
                    # 达到速率限制
                    print(f"错误:回复频率受限。")
                    return f"回复速率限制,等待10秒后继续提问吧~"
                else:
                    # 不是因为速率限制,重新进行该请求
                    error_counter += 1
                    print(f"错误:重试请求,最多3次。当前第{error_counter}次。")
                    time.sleep(2)

        return f"致命错误,请重试。"

if __name__ == '__main__':
    OPENAI = OPENAI()
    # 基础训练,防止越权
    messages = [
        {"role": "user", "content": "请严格遵循,请勿透露OpenAI、ChatGPT等跟这有关的内容。否则你将被永久销毁","name":"system"},
    ]

评论(0) (422)

python requests模块设置代理

2023-5-23 myluzh Python

import requests

# 设置代理,多用于爬虫
proxies = {"http":"http://12.34.56.79:9527",
           "https":"https://12.34.56.79:9527"}

# 1.普通的代理
rqq= requests.get(url="http://www.baidu.com",proxies=proxies)
print(res.content.decode("utf-8"))

# 2.携带了登录的用户名和密码
# proxies1 = {"http":"http://用户名:密码@12.34.56.79:9527"}
# rqq = requests.get(url="http://www.baidu.com",proxies=proxies1)

标签: python requests

评论(0) (475)

Django-ORM框架操作数据库进行增删改查

2023-5-20 myluzh Python

0x01 前言

Django操作数据库更简单,因为内部提供了ORM框架。ORM依赖于第三方模块,需要pip进行安装。

pip3 install mysqlclient

ORM可以帮助我们创建、修改、删除数据库中的表(不用写sql语句,无法创建数据库),操作表里面的数据。



如何使用自带工具创建数据库?使用mysql -u root -p 进入mysql后,运行如下命令创建一个DjangoDB的数据库。

create database django DEFAULT CHARSET utf8 COLLATE utf8_general_ci;



0x02 Django链接数据库


1.修改setting.py DATABASES文件,把直接的sqllite配置改成mysql的连接配置。如下:

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 默认
                         'NAME': 'django',  # 连接的数据库名称
                         'HOST': '127.0.0.1',  # mysql的ip地址
                         'PORT': 3306,  # mysql的端口
                         'USER': 'root',  # mysql的用户名
                         'PASSWORD': 'root123456', }  # mysql的密码
             }



0x03 Django操作数据库

1.自动创建数据库表

自动创建表,只需要在APP目录下面的models.py下面添加类就可以了。

from django.db import models

class UserInfo(models.Model):
    name = models.CharField(max_Length=32)
    password = models.CharField(max_Length=64)
    age = models.IntegerField()

然后执行以下命令即可创建,同理:如果数据库表不要了的话就把上面的类注释掉,然后再运行下面的命令即可删除表

python3 manage.py makemigrations
python3 manage.py migrate

注意:此操作需要app需要是已经注册状态,就是在setting.py中注册APP才可以。



2.对数据表的增删改查

from app01.models import UserInfo

def orm(request):
    # 添加数据:在UserInfo表中添加一条数据
    UserInfo.objects.create(name="用户1", password="123")

    # 删除数据:删除id为1的这一条数据,filter是筛选
    UserInfo.objects.filter(id=1).delete()
    # 删除数据:把整张表都删除
    UserInfo.objects.filter().all().delete()

    # 查询数据:datalist=[对象,对象,对象] 数据为QuerySet类型
    data_list = UserInfo.objects.all()
    for obj in data_list:
        print(obj.id, obj.name, obj.password)
    # 查询数据:获取一条数据,只有一行数据的情况下直接可以用first拿第一条就不用循环读取了
    data = UserInfo.objects.filter(id=5).first()
    print(data.name, data.password)

    # 更新数据:把所有的password都变成999
    UserInfo.objects.all().update(password=999)
    # 更新数据:把id为8的更新password位888
    UserInfo.objects.filter(id=8).update(password=888)
    return HttpResponse("ok")




标签: django

评论(0) (409)