<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[s695811494的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/s695811494</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; s695811494]]></copyright><item><title><![CDATA[Python 阻塞型I/O和GIL]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/113063028</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/113063028</guid><author>s695811494</author><pubDate>Sat, 23 Jan 2021 21:54:23 +0800</pubDate><description><![CDATA[GIL 几乎对 I/O 密集型处理无害

CPython 解释器本身就不是线程安全的，因此有全局解释器锁(GIL)， 一次只允许使用一个线程执行 Python 字节码。

这是 CPython 解释器的局限，与 Python 语言本身无关。Jython 和 IronPython 没有这种限制。 不过，目前最快的 Python 解释器 PyPy 也有 GIL。

标准库中所有执行阻塞型 I/O 操作的函数，在等待操作系统返回结果时都会释放GIL。这意味着在 Python 语言这个层次上可以使用多线 程，而 I]]></description><category></category></item><item><title><![CDATA[Python 使用future处理并发]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/113062998</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/113062998</guid><author>s695811494</author><pubDate>Sat, 23 Jan 2021 21:53:46 +0800</pubDate><description><![CDATA[Python标准库的两个Future
1. concurrent.futures.Future
2.asyncio.Future
这两个类作用相同，都表示可能已经完成或尚未完成的延迟计算。
future封装待完成的操作，可以放入队列，完成的状态可以查询，得到结果后可以获取结果。

两种Future的几种常用方法：

.done()，这个方法不阻塞，返回值是bool值，指明future连接的可调用对象是否已经执行
	.adddonecallback()，这个方法只有一个参数，类型是可调用的对象，future运]]></description><category></category></item><item><title><![CDATA[python 协程二]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112097682</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112097682</guid><author>s695811494</author><pubDate>Sat, 02 Jan 2021 15:10:17 +0800</pubDate><description><![CDATA[1 使用协程实现移动均值函数


&gt;&gt;&gt; from inspect import getgeneratorstate as gs
&gt;&gt;&gt; def mean_coroutine():
...   total = 0
...   count = 0
...   average = None
...   while True:
...     val = yield average
...     total += val
...     count += 1
...     ]]></description><category></category></item><item><title><![CDATA[python 协程一]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112097536</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112097536</guid><author>s695811494</author><pubDate>Sat, 02 Jan 2021 15:06:43 +0800</pubDate><description><![CDATA[协程，又称微线程，纤程，英文名Coroutine。

协程使用生成器定义：定义体中含有yield关键字


&gt;&gt;&gt; from inspect import getgeneratorstate      # ①
&gt;&gt;&gt; def coroutine():
...   print("step one")
...   x = yield                            
...   print("step two x value :", x)
... 
&g]]></description><category></category></item><item><title><![CDATA[Python 上下文管理器和with块 二]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112094191</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112094191</guid><author>s695811494</author><pubDate>Sat, 02 Jan 2021 11:29:08 +0800</pubDate><description><![CDATA[标准库中还有个contextlib 模块，提供一些实用工具，

closing
	如果对象提供了 close() 方法，但没有实现 __enter__/__exit__ 协议，那么可以使用这个函数构建上下文管理 器。
	@contextmanager
	这个装饰器把简单的生成器函数变成上下文管理器，这样就不用创 建类去实现管理器协议了。
	
	ExitStack
	这个上下文管理器能进入多个上下文管理器。例如，同时打开任意一个文件列表中的所有文件。
	
下面展开介绍下@contextmanager
...]]></description><category></category></item><item><title><![CDATA[Python 上下文管理器和with块 一]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112093625</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112093625</guid><author>s695811494</author><pubDate>Sat, 02 Jan 2021 10:50:57 +0800</pubDate><description><![CDATA[上下文管理器对象存在的目的是管理 with 语句，就像迭代器的存在是为了管理 for 语句一样
	上下文管理器协议包含 __enter__ 和 __exit__ 两个方法
	把值绑定到目标变量上(as 子句)是在上下文管理器对象上调用 __enter__ 方法的结果
	
	with语句开始运行时，会在上下文管理器对象上调用 __enter__ 方法，with 语句运行结束后，会在上下文管理器对象上调用__exit__方法。不管控制流程以哪种方式退出 with块，都会在上下文管理器对象上调用__exit__方]]></description><category></category></item><item><title><![CDATA[C++多线程二 向线程函数传递参数]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112060221</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112060221</guid><author>s695811494</author><pubDate>Fri, 01 Jan 2021 14:20:16 +0800</pubDate><description><![CDATA[thread对象第一个参数是函数或可调用对象，后面依次传入函数或可调用对象的n个参数


	需要注意的是默认参数是拷贝到线程独立内存中
	

void update_data_for_widget(widget_id w, widget_data&amp; data); // ① void oops_again(widget_id w) { 
  widget_data data; 
  std::thread t(update_data_for_widget, w, data); // ② 
  disp]]></description><category></category></item><item><title><![CDATA[C++多线程一 启动/加入/分离线程]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/112000813</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/112000813</guid><author>s695811494</author><pubDate>Thu, 31 Dec 2020 00:14:19 +0800</pubDate><description><![CDATA[C++线程库启动线程，可以归结为构造std::thread对象
	std::thread在头文件&lt;thread&gt;
	std::thread 可以用可调用(callable)类型构造
	启动线程之后，要选择结束线程的方式，等待线程结束(加入式.join())，还是让其自主运行(分离式.detach)
代码示例：


struct func {
  int&amp; i;
  func(int&amp; i_) : i(i_) {} void operator() () {
    for (uns]]></description><category></category></item><item><title><![CDATA[Python    if之外的else块]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111829155</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111829155</guid><author>s695811494</author><pubDate>Mon, 28 Dec 2020 00:20:43 +0800</pubDate><description><![CDATA[通常if/else连起来使用，要么做这个，要么做那个。不过else还可以跟while/for/try连起来使用，表示先做这个，再做那个。

for仅当 for 循环运行完毕时(即 for 循环没有被 break 语句中止) 才运行 else块

&gt;&gt;&gt; for i in [1,2,3]:
...     if i == 2:
...         break
... else:
...     print("else content")
...  # for 被break，所以没有执行e]]></description><category></category></item><item><title><![CDATA[Python 解释器]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111770362</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111770362</guid><author>s695811494</author><pubDate>Sat, 26 Dec 2020 22:19:10 +0800</pubDate><description><![CDATA[一句话定义就是，解释器是代码与计算机硬件之间的软件逻辑层

python代码执行过程：


	源代码*.py文件编译成字节码.pyc文件
	
	
	将.pyc文件转发到所谓的“虚拟机(PVM)”中
	
下面简单介绍下上述两个步骤，


	字节码编译 编译是一个简单的翻译过程，字节码是源代码底层的，与平台无关的表现形式 如果源码(*.py)没有改动，执行过程会直接使用字节码(*.pyc)；如果发生改动，字节码文件将被重建 如果机器上不允许写入字节码，程序仍然可以工作，*.pyc文件会在内存中被创建，程序结束后]]></description><category></category></item><item><title><![CDATA[Ubuntu16.04 安装pytorch]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111767475</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111767475</guid><author>s695811494</author><pubDate>Sat, 26 Dec 2020 18:37:04 +0800</pubDate><description><![CDATA[1.下载anaconda

https://www.anaconda.com/products/individual#linux

2.安装anconda

bash Anaconda3-2020.02-Linux-x86_64.sh

enter -------------------------------

3.下载pytorch

git clonepytorch/pytorch

4.创建虚拟环境

conda create -n your_virtualenv_name python=3.7..]]></description><category></category></item><item><title><![CDATA[Pytorch hook(钩子函数)]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111767338</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111767338</guid><author>s695811494</author><pubDate>Sat, 26 Dec 2020 18:31:49 +0800</pubDate><description><![CDATA[# example 
# 定义用于获取网络各层输入输出tensor的容器,并定义module_name用于记录相应的module名字
module_name = []
features_in_hook = []
features_out_hook = []

# hook函数负责将获取的输入输出添加到feature列表中,并提供相应的module名字
# fea_in当前forward 的输入,fea_out当前forward的输出
def hook(module, fea_in, fea_out):  .]]></description><category></category></item><item><title><![CDATA[协程 Python yield]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111765500</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111765500</guid><author>s695811494</author><pubDate>Sat, 26 Dec 2020 18:14:07 +0800</pubDate><description><![CDATA[协程，又称微线程，纤程。英文名Coroutine。


	协程看上去也是子程序，但执行过程中，在子程序内部可中断，然后转而执行别的子程序，在适当的时候再返回来接着执行。
	
	
	协程是一个线程执行
	
	
	Python对协程的支持还非常有限，用在generator中的yield可以一定程度上实现协程
	

import time

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
      ]]></description><category></category></item><item><title><![CDATA[模型量化（Model Quantization）]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111659596</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111659596</guid><author>s695811494</author><pubDate>Fri, 25 Dec 2020 00:56:09 +0800</pubDate><description><![CDATA[Tensorflow Model Quantization

Quantizing deep convolutional networks for efficient inference: A whitepaper

推理加速库：GEMMLOWP , Intel MKL-DNN , ARM CMSIS , Qualcomm SNPE , Nvidia TensorRT

降低模型复杂度的方法-&gt;降低权重和激活输出的精度要求-----int8，int16量化

1.优点

无需重训练
	几乎不会有精度损]]></description><category></category></item><item><title><![CDATA[python 常用内置函数]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111658854</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111658854</guid><author>s695811494</author><pubDate>Fri, 25 Dec 2020 00:39:32 +0800</pubDate><description><![CDATA[__getitem__ 支持对象可迭代
	
	
	__setitem__ 支持可变序列协议
	
	
	__iter__ 返回 self，以便在应该使用可迭代对象的地方使用迭代器，例如在 for 循环中
	
	
	__getattr__
	
	
	__setattr__
	
	
	__repr__ 以便于开发者理解的方式返回对象的字符串表示形式
	
	
	__str__ 以便于用户理解的方式返回对象的字符串表示形式
	
	
	__len__
	
	
	__eq__
	
	
	__hash_ 创建可散列的类..]]></description><category></category></item><item><title><![CDATA[python __call__]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111658734</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111658734</guid><author>s695811494</author><pubDate>Thu, 24 Dec 2020 23:57:15 +0800</pubDate><description><![CDATA[__call__()的作用是使实例能够像函数一样被调用，同时不影响实例本身的生命周期（__call__()不影响一个实例的构造和析构），但是__call__()可以用来改变实例的内部成员的值。


class X(object):
    def __init__(self, a, b, range):
        self.a = a
        self.b = b
        self.range = range
    def __call__(self, a, b):
        ]]></description><category></category></item><item><title><![CDATA[C++ constexpr]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111597926</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111597926</guid><author>s695811494</author><pubDate>Wed, 23 Dec 2020 20:03:28 +0800</pubDate><description><![CDATA[constexpr : 不仅是const，而且在编译期已知

一言以蔽之，所有constexpr对象都是const对象，而非所有const对象都是constexpr对象。


int sz；
constexpr auto arraySize1 = sz； // 错误，编译期未知
std::array&lt;int, sz&gt; data1; // 错误，一样的问题
constexpr arraySize2 = 10；
std::array&lt;int, arraySize2&gt; data2; // ]]></description><category></category></item><item><title><![CDATA[C++ decltype/auto]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/111597853</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/111597853</guid><author>s695811494</author><pubDate>Wed, 23 Dec 2020 19:59:16 +0800</pubDate><description><![CDATA[auto一般会忽略顶层const，保留底层const


int i = 0;
const int ci = i;
auto b = ci; // 顶层const被忽略，b是int
auto c = &amp;ci； // 底层const被保留，c 是int * const，指向常量整型的指针
const auto f = ci；// 如果希望推断出auto类型是一个顶层const，则需要明确指出

decltype 返回变量的类型，包括顶层const和引用在内


const int ci = 0， &a]]></description><category></category></item><item><title><![CDATA[C++ 排序函数 sort(),qsort()的用法]]></title><link>https://blog.youkuaiyun.com/s695811494/article/details/71122655</link><guid>https://blog.youkuaiyun.com/s695811494/article/details/71122655</guid><author>s695811494</author><pubDate>Wed, 03 May 2017 13:39:16 +0800</pubDate><description><![CDATA[想起来自己天天排序排序，冒泡啊，二分查找啊，结果在STL中就自带了排序函数sort,qsort，总算把自己解脱了~
所以自己总结了一下，首先看sort函数见下表：




函数名
功能描述


sort
对给定区间所有元素进行排序


stable_sort
对给定区间所有元素进行稳定排序


partial_sort
对给定区间所有元素部分排序]]></description><category></category></item></channel></rss>