GVKun编程网logo

Python / Django循环优化(pythonfor循环优化)

7

如果您想了解Python/Django循环优化的相关知识,那么本文是一篇不可错过的文章,我们将对pythonfor循环优化进行全面详尽的解释,并且为您提供关于10招教你玩转Python循环优化、Dja

如果您想了解Python / Django循环优化的相关知识,那么本文是一篇不可错过的文章,我们将对pythonfor循环优化进行全面详尽的解释,并且为您提供关于10招教你玩转Python循环优化、Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)、Django 之在 Python 中调用 Django 环境、Django.GitHub Python 网页框架 Django 资源集合的有价值的信息。

本文目录一览:

Python / Django循环优化(pythonfor循环优化)

Python / Django循环优化(pythonfor循环优化)

这可能没有您想要的效率高,但是您可以尝试一下。 如果仍然不能满足您的要求,那么我能想到的就是异步执行此操作。

iterator = Prices.objects.filter(website=website)

from collections import defaultdict
result = reduce(lambda acc,prices: acc[prices.date].append((prices.price * 0.01,prices.website)) or acc,filter(lambda x: x.date in labels,iterator),defaultdict(list))

异步执行此操作的一种方法是 使用concurrent.futures module

ThreadPoolExecutor(max_workers = 10)(您可以这样指定最多工作人员)。

此外,如果您要多个进程,而不是线程。 您只需将 ThreadPoolExecutor 替换为 ProcessPoolExecutor

result = defaultdict(list)
def reducer_function(price):
    if price.date in labels:
        result[price.date].append((prices.price * 0.01,prices.website))

with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(reducer_function,iterator)

10招教你玩转Python循环优化

10招教你玩转Python循环优化

大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。

更多Python学习内容:http://ipengtao.com

在Python编程中,循环是最常见的控制结构之一。尽管Python的循环语法简单明了,但在处理大量数据或进行复杂计算时,循环可能会成为性能瓶颈。本文将介绍10种加速Python循环的方法,帮助在保持代码可读性的同时显著提高性能。

1. 使用列表解析(List Comprehensions)

列表解析是一种简洁且高效的创建列表的方式,比传统的for循环更快。

示例代码:

# 传统的for循环
squares = []
for i in range(10):87
    squares.append(i**2)

# 使用列表解析
squares = [i**2 for i in range(10)]

2. 使用生成器(Generators)

生成器在处理大量数据时非常有用,它们可以节省内存并提高迭代效率。

示例代码:

# 使用生成器表达式
squares_gen = (i**2 for i in range(10))

# 迭代生成器
for square in squares_gen:
    print(square)

3. 使用内置函数(Built-in Functions)

Python内置函数如sum()map()filter()经过高度优化,通常比自定义循环更快。

示例代码:

# 传统的for循环
total = 0
for i in range(100):
    total += i

# 使用sum()内置函数
total = sum(range(100))

4. 使用NumPy库

NumPy是一个强大的科学计算库,提供了高效的数组操作。使用NumPy数组进行向量化运算可以显著加速循环。

示例代码:

import numpy as np

# 使用传统的for循环计算数组元素平方
arr = [1, 2, 3, 4, 5]
squares = []
for i in arr:
    squares.append(i**2)

# 使用NumPy进行向量化运算
arr_np = np.array([1, 2, 3, 4, 5])
squares_np = arr_np**2

5. 使用多线程(Multithreading)

对于I/O密集型任务,可以使用多线程来提高效率。不过需要注意的是,Python的全局解释器锁(GIL)限制了多线程在CPU密集型任务中的性能提升。

示例代码:

import threading

def task(n):
    print(f"Processing {n}")

threads = []
for i in range(10):
    t = threading.Thread(target=task, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

6. 使用多进程(Multiprocessing)

多进程可以绕过GIL限制,适用于CPU密集型任务。Python的multiprocessing模块提供了简便的多进程支持。

示例代码:

import multiprocessing

def task(n):
    return n**2

if __name__ == ''__main__'':
    with multiprocessing.Pool(processes=4) as pool:
        results = pool.map(task, range(10))
    print(results)

7. 使用Cython

Cython是Python的一个超集,可以将Python代码编译成C语言,从而大幅提高性能。

示例代码:

首先,编写一个简单的Cython代码example.pyx

def cython_function(int n):
    cdef int i
    cdef int total = 0
    for i in range(n):
        total += i
    return total

然后,编译该代码:

$ cythonize -i example.pyx

最后,使用编译后的Cython模块:

import example
print(example.cython_function(1000000))

8. 使用并行计算库(Parallel Computing Libraries)

如Dask和Joblib等并行计算库可以帮助你利用多核处理器来加速循环。

示例代码(使用Joblib):

from joblib import Parallel, delayed

def task(n):
    return n**2

results = Parallel(n_jobs=4)(delayed(task)(i) for i in range(10))
print(results)

9. 预分配列表大小

在循环中动态扩展列表会增加开销,预分配列表大小可以提高效率。

示例代码:

# 动态扩展列表
result = []
for i in range(1000):
    result.append(i**2)

# 预分配列表大小
result = [None] * 1000
for i in range(1000):
    result[i] = i**2

10. 使用Pandas库

Pandas库在处理数据时非常高效,尤其适合处理大型数据集。

示例代码:

import pandas as pd

# 使用传统的for循环计算DataFrame列的平方
data = {''numbers'': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)
df[''squares''] = None
for i in range(len(df)):
    df.at[i, ''squares''] = df.at[i, ''numbers'']**2

# 使用Pandas内置方法
df[''squares''] = df[''numbers'']**2

总结

通过本文介绍的10种方法,可以显著加速Python循环,从而提高代码性能。不同的方法适用于不同的场景,选择最合适的方法将帮助你在处理大数据和复杂计算时事半功倍。

Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项

 

参考:https://blog.csdn.net/weixin_40475396/article/details/82971541

 
 

1. 编码

unicode,str,bytes在python2和python3中的叫法以及相互转换,具体为:

  1. 在Python3中的str对象在Python2中叫做unicode,但 bytes 对象在Python2中叫做str,如果想得到一个文本字符串,需要在字符串之前加上前缀 u 或者decode一下。
  2. 项目中的问题:① python2项目中字符串前加的u可以去掉了,因为在python3中就是一个文本字符串,也就是str对象,②获取阿里云签名的视图函数,涉及到编码问题,需要处理
  3. 编码问题参考:https://blog.csdn.net/yanghuan313/article/details/63262477

2. Model外键

  1. python3中Model中字段的外键必须设置on_delete,一般设置为on_delete=models.DO_NOTHING,代表删除与关联内容无关
  2. 同一张表多个字段引用相同的外键需要设置related_name
  3. Model外键问题参考:https://blog.csdn.net/lht_521/article/details/80605146

3. 判断是否是匿名用户

  1. django1.8.2是is_anonymous()
  2. django2.0是is_anonymous

4. Exception

    1.  
      python2捕获异常是:
    2.  
      try:
    3.  
      Exception,e
    4.  
      pass
    5.  
       
    6.  
      python3捕获异常是:
    7.  
      try:
    8.  
      Exception as e
    9.  
      pass

     

  1. raise异常直接写字符串到异常中,例如:
    1.  
      python2:
    2.  
      raise SimpleAjaxException,''Return data should be follow the Simple Ajax Data Format'' 
    3.  
      python3:
    4.  
      raise SimpleAjaxException(''Return data should be follow the Simple Ajax Data Format'')

     

5. urls.py

  1. 静态文件收集:
    django1.8:
    url(r''^static/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.STATIC_ROOT}) 
    django2.0:
    1.  
      from django.views.static import serve 
    2.  
      url( r''^static/(?P<path>.*)$'', serve, {''document_root'': settings.STATIC_ROOT})
  2. 导入的文件时,同目录下,不能再直接import了,使用from . import **,
  3. 绝对导入相对导入参考:https://www.jianshu.com/p/5cc20b88bcf4

6. 中间件类继承

  1. django1.8.2继承的是object
  2. django2.0继承的是MiddlewareMixin,导入方法:
    from django.utils.deprecation import MiddlewareMixin

7. 字典Dict

  1. Python 3.0 内的另一个重大改变是字典内dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的删除。取而代之的是:dict.keys(),dict.values(),dict.items()
  2. dict.haskey()在Python2中存在,但是在Python3中更改为contains_

8. seetings设置

  1. Django1.8.2中间件配置名称是MIDDLEWARE_CLASSES,Django2.0是MIDDLEWARE

9. 缓存问题

  1. Python2和Python3对换错的哈希方式不同,上线的时候最好是把缓存清一下。
    Bug:上线Python3,因为用户系统问题,上线失败,退回到Python2,此时因为有Python3的缓存,而版本是Python2的版本,导致报错。
    解决方式:清除缓存。

10. 用户系统问题

如果两个项目共用一个用户系统,Django2.0项目的用户在登陆状态,如果此时Django1.8项目登陆此用户,再次刷新Django2.0项目的此用户,就需要重新登录。
此问题是因为Django1.8和2.0中间件对哈希的密码校验问题不同导致的request请求时,对象中的 session_id 消失,最终导致数据库中session被清除,目前能暂时解决,绕过这个问题,尚未找到根本原因。
解决办法: 
1)在用户表的Model里面添加方法,相当于撤回到python2的验证机制,强制绕过这个登陆时校验密码hash之后跟缓存中的hash密码是否一致。

  1.  
    def getattribute(self, item):
  2.  
    if item == ''getsessionauthhash'':
  3.  
       raise AttributeError
  4.  
    return super().getattribute_(item)

2) 回归到第一条,校验用户时,对密码hash,是通过一个固定的值加密码hash的,django1.8和2.0这个固定的值不同,导致密码hash之后跟缓存中的hash密码不一致,如果将不同版本的这个值设为相同的话,就ok了,其实settings.py里面就可以设置,只是不同版本有默认值,就没有在显示设置。如下:
PASSWORD_HASHERS = [ ''core.hasher.CustomPBKDF2PasswordHasher''] 
然后再相对于的路径创建文件重写类:比如上面就是在core文件夹下的hasher.py文件重写CustomPBKDF2PasswordHasher类:

  1.  
    from django.contrib.auth.hashers import PBKDF2PasswordHasher
  2.  
    class CustomPBKDF2PasswordHasher(PBKDF2PasswordHasher):
  3.  
      iterations = 20000

11.附上更改过程中看到的不错的文章:

1)Python3.x新特性以及十大变化

2)Django从1.8升级到2.0注意事项

3)Django 外键ForeignKey中的on_delete

Django 之在 Python 中调用 Django 环境

Django 之在 Python 中调用 Django 环境

Django 之在 Python 中调用 Django 环境

 

  新建一个 py 文件,在其中写下如下代码:

 1 import os
 2 
 3 if __name__ == ''__main__'':
 4     os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''BMS.settings'')
 5 
 6     import django
 7 
 8     django.setup()
 9 
10 
11     ---------------------------------------
12     # 内容区

 

Django.GitHub Python 网页框架 Django 资源集合

Django.GitHub Python 网页框架 Django 资源集合

模块相关:

Channels

简介: Channels 旨在增强 Django 的异步能力,同时让 Django 不仅仅局限于 Request-Response 模型,能够支持 WebSocket,HTTP2 推送和背景任务.

 

Django-Baker

简介: Django Baker 可以帮助开发者快速启动项目。只要提供 app 名称,Django Baker 就可以根据 models.py 文件中的 models, 自动生成视图,表单,URL,admin 页面以及模板.

 

Django-Q 

简介: Django Q 是一个原生 Django 分布式任务队列处理应用,通过 Python 的 mutliprocessing 模块功能实现.

 

django-webpack-loader

简介: Django webpack loader 对 webpack-bundle-tracker 的输出结果进行处理,让你可以在自己的 Django 应用中使用生成的 bundles

 

django-hackathon-starter 

简介: django-hackathon-starter 这是一个 Django Web 应用模板程序,可以帮助你快速生成应用,必定能够为你节省大量的开发时间,同时这个库也能用作开发者的学习指南.

 

django-seed 

简介: Django-seed 通过 faker 库,为 Django 模型生成测试数据,该库支持 Python 和 Django 的最新版本.

 

django-tenants

简介: django-tenants 让 django 驱动的网站支持多个 tenants, 这个功能是通过 PostgreSQL schemas 实现的。这是每个 SASS(软件即服务)网站的核心功能

 

项目相关:

OSQA

简介:一款免费且开源的问答系统,采用 Python 的 Django 开发框架,基于中国优秀的问答系统 CNProg, 非常类似国外著名的技术问答网站 http://stackoverflow.com .

 

io

简介: Python+Django 构建的 Blog - 基于 Python+Django 构建的 Blog  io by xushvai

LibraryManagement

简介: LibraryManagement 图书管理系统 (Django1.9.1+Bootstrap3)。

 

CommunityManagement 

简介:用 Django 基于组合模式开发的一个小型的社团管理系统。

 

django-shop 

简介: Django 做的开源电子商务网站

 

weixin_market 

简介:基于 mezzanine 与 django 的 web 服务器,微信商城。

 

deisp

简介:开源 PaaS 系统 Deis 是一个 Django/Celery API 服务器,Python CLI 和一组 Chef cookbooks 合并起来提供一个类似 Heroku 的应用平台,用于公有云和私有云

 

ASKBOT-devel 

简介:一款免费且开源的问答系统,采用 Python 的 Django 开发

 

taiga-back 

简介: Taiga 功能非常强大的项目管理平台。用于初创企业和敏捷开发团队,采用 Django 框架开发,前端基于 AngularJS 实现.

 

 

登录乐搏学院官网 http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “满满李 - 运维开发之路” 博客,请务必保留此出处 http://xmdevops.blog.51cto.com/11144840/1846241

我们今天的关于Python / Django循环优化pythonfor循环优化的分享就到这里,谢谢您的阅读,如果想了解更多关于10招教你玩转Python循环优化、Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)、Django 之在 Python 中调用 Django 环境、Django.GitHub Python 网页框架 Django 资源集合的相关信息,可以在本站进行搜索。

本文标签: