Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
79fe67fb
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
79fe67fb
编写于
7月 16, 2020
作者:
L
Leo Chen
提交者:
GitHub
7月 16, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add tool to count all op-related api that without core.ops, test=develop (#25552)
上级
73409d50
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
140 addition
and
0 deletion
+140
-0
tools/count_api_without_ops.py
tools/count_api_without_ops.py
+140
-0
未找到文件。
tools/count_api_without_ops.py
0 → 100644
浏览文件 @
79fe67fb
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
List all operator-raleated APIs that contains append_op but not core.ops.xx.
Usage:
python ./count_api_without_ops.py paddle
"""
from
__future__
import
print_function
import
importlib
import
inspect
import
collections
import
sys
import
pydoc
import
hashlib
import
six
import
functools
visited_modules
=
set
()
# APIs that should not be printed into API.spec
omitted_list
=
[
"paddle.fluid.LoDTensor.set"
,
# Do not know why it should be omitted
"paddle.fluid.io.ComposeNotAligned"
,
"paddle.fluid.io.ComposeNotAligned.__init__"
,
]
api_with_ops
=
[]
api_without_ops
=
[]
def
queue_dict
(
member
,
cur_name
):
if
cur_name
in
omitted_list
:
return
if
inspect
.
isclass
(
member
):
pass
else
:
try
:
source
=
inspect
.
getsource
(
member
)
if
source
.
find
(
'append_op'
)
!=
-
1
:
if
source
.
find
(
'core.ops'
)
!=
-
1
:
api_with_ops
.
append
(
cur_name
)
else
:
api_without_ops
.
append
(
cur_name
)
except
Exception
as
e
:
# special for PyBind method
pass
def
visit_member
(
parent_name
,
member
):
cur_name
=
"."
.
join
([
parent_name
,
member
.
__name__
])
if
inspect
.
isclass
(
member
):
queue_dict
(
member
,
cur_name
)
for
name
,
value
in
inspect
.
getmembers
(
member
):
if
hasattr
(
value
,
'__name__'
)
and
(
not
name
.
startswith
(
"_"
)
or
name
==
"__init__"
):
visit_member
(
cur_name
,
value
)
elif
inspect
.
ismethoddescriptor
(
member
):
return
elif
callable
(
member
):
queue_dict
(
member
,
cur_name
)
elif
inspect
.
isgetsetdescriptor
(
member
):
return
else
:
raise
RuntimeError
(
"Unsupported generate signature of member, type {0}"
.
format
(
str
(
type
(
member
))))
def
is_primitive
(
instance
):
int_types
=
(
int
,
long
)
if
six
.
PY2
else
(
int
,
)
pritimitive_types
=
int_types
+
(
float
,
str
)
if
isinstance
(
instance
,
pritimitive_types
):
return
True
elif
isinstance
(
instance
,
(
list
,
tuple
,
set
)):
for
obj
in
instance
:
if
not
is_primitive
(
obj
):
return
False
return
True
else
:
return
False
def
visit_all_module
(
mod
):
mod_name
=
mod
.
__name__
if
mod_name
!=
'paddle'
and
not
mod_name
.
startswith
(
'paddle.'
):
return
if
mod_name
.
startswith
(
'paddle.fluid.core'
):
return
if
mod
in
visited_modules
:
return
visited_modules
.
add
(
mod
)
for
member_name
in
(
name
for
name
in
(
mod
.
__all__
if
hasattr
(
mod
,
"__all__"
)
else
dir
(
mod
))
if
not
name
.
startswith
(
"_"
)):
instance
=
getattr
(
mod
,
member_name
,
None
)
if
instance
is
None
:
continue
if
is_primitive
(
instance
):
continue
if
not
hasattr
(
instance
,
"__name__"
):
continue
if
inspect
.
ismodule
(
instance
):
visit_all_module
(
instance
)
else
:
visit_member
(
mod
.
__name__
,
instance
)
modules
=
sys
.
argv
[
1
].
split
(
","
)
for
m
in
modules
:
visit_all_module
(
importlib
.
import_module
(
m
))
print
(
'api_with_ops:'
,
len
(
api_with_ops
))
print
(
'
\n
'
.
join
(
api_with_ops
))
print
(
'
\n
==============
\n
'
)
print
(
'api_without_ops:'
,
len
(
api_without_ops
))
print
(
'
\n
'
.
join
(
api_without_ops
))
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录