Skip to content

Commit 386a4ff

Browse files
author
Christopher Doris
committed
shave about 5 seconds from init
1 parent 0f70458 commit 386a4ff

File tree

4 files changed

+137
-268
lines changed

4 files changed

+137
-268
lines changed

src/cpython/CPython.jl

Lines changed: 90 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -101,140 +101,65 @@ include("as.jl")
101101
include("arg.jl")
102102

103103
@init begin
104-
PyObject_TryConvert_AddRules(
105-
"builtins.NoneType",
106-
[
107-
(Nothing, PyNone_TryConvertRule_nothing, 100),
108-
(Missing, PyNone_TryConvertRule_missing),
109-
],
110-
)
111-
PyObject_TryConvert_AddRules("builtins.bool", [(Bool, PyBool_TryConvertRule_bool, 100)])
112-
PyObject_TryConvert_AddRules(
113-
"numbers.Integral",
114-
[
115-
(Integer, PyLongable_TryConvertRule_integer, 100),
116-
(Rational, PyLongable_TryConvertRule_tryconvert),
117-
(Real, PyLongable_TryConvertRule_tryconvert),
118-
(Number, PyLongable_TryConvertRule_tryconvert),
119-
(Any, PyLongable_TryConvertRule_tryconvert),
120-
],
121-
)
122-
PyObject_TryConvert_AddRules(
123-
"builtins.float",
124-
[(Float64, PyFloatable_TryConvertRule_convert, 100)],
125-
)
126-
PyObject_TryConvert_AddRules(
127-
"numbers.Real",
128-
[
129-
(Float64, PyFloatable_TryConvertRule_convert),
130-
(BigFloat, PyFloatable_TryConvertRule_convert),
131-
(Float32, PyFloatable_TryConvertRule_convert),
132-
(Float16, PyFloatable_TryConvertRule_convert),
133-
(AbstractFloat, PyFloatable_TryConvertRule_tryconvert),
134-
(Real, PyFloatable_TryConvertRule_tryconvert),
135-
(Number, PyFloatable_TryConvertRule_tryconvert),
136-
],
137-
)
138-
PyObject_TryConvert_AddRules(
139-
"builtins.complex",
140-
[(Complex{Float64}, PyComplexable_TryConvertRule_convert, 100)],
141-
)
142-
PyObject_TryConvert_AddRules(
143-
"numbers.Complex",
144-
[
145-
(Complex{Float64}, PyComplexable_TryConvertRule_convert),
146-
(Complex{BigFloat}, PyComplexable_TryConvertRule_convert),
147-
(Complex{Float32}, PyComplexable_TryConvertRule_convert),
148-
(Complex{Float16}, PyComplexable_TryConvertRule_convert),
149-
(Complex{T} where {T<:AbstractFloat}, PyComplexable_TryConvertRule_tryconvert),
150-
(Complex{T} where {T<:Real}, PyComplexable_TryConvertRule_tryconvert),
151-
(Number, PyComplexable_TryConvertRule_tryconvert),
152-
],
153-
)
154-
PyObject_TryConvert_AddRules(
155-
"builtins.bytes",
156-
[
157-
(Vector{UInt8}, PyBytes_TryConvertRule_vector),
158-
(Vector{Int8}, PyBytes_TryConvertRule_vector),
159-
(String, PyBytes_TryConvertRule_string),
160-
],
161-
)
162-
PyObject_TryConvert_AddRules(
163-
"builtins.str",
164-
[
165-
(String, PyUnicode_TryConvertRule_string, 100),
166-
(Symbol, PyUnicode_TryConvertRule_symbol),
167-
(Char, PyUnicode_TryConvertRule_char),
168-
(Vector{UInt8}, PyUnicode_TryConvertRule_vector),
169-
(Vector{Int8}, PyUnicode_TryConvertRule_vector),
170-
],
171-
)
172-
PyObject_TryConvert_AddRules(
173-
"builtins.tuple",
174-
[(Tuple, PyIterable_ConvertRule_tuple, 100)],
175-
)
176-
PyObject_TryConvert_AddRules(
177-
"builtins.range",
178-
[
179-
(
180-
StepRange{T,S} where {T<:Integer,S<:Integer},
181-
PyRange_TryConvertRule_steprange,
182-
100,
183-
),
184-
(UnitRange{T} where {T<:Integer}, PyRange_TryConvertRule_unitrange),
185-
],
186-
)
187-
PyObject_TryConvert_AddRules(
188-
"collections.abc.Iterable",
189-
[
190-
(Vector, PyIterable_ConvertRule_vecorset),
191-
(Set, PyIterable_ConvertRule_vecorset),
192-
(Tuple, PyIterable_ConvertRule_tuple),
193-
(NamedTuple, PyIterable_ConvertRule_namedtuple),
194-
(Pair, PyIterable_ConvertRule_pair),
195-
],
196-
)
197-
PyObject_TryConvert_AddRules(
198-
"collections.abc.Sequence",
199-
[(Vector, PyIterable_ConvertRule_vecorset)],
200-
)
201-
PyObject_TryConvert_AddRules(
202-
"collections.abc.Set",
203-
[(Set, PyIterable_ConvertRule_vecorset)],
204-
)
205-
PyObject_TryConvert_AddRules(
206-
"collections.abc.Mapping",
207-
[(Dict, PyMapping_ConvertRule_dict)],
208-
)
209-
PyObject_TryConvert_AddRules("datetime.time", [(Time, PyTime_TryConvertRule_time, 100)])
210-
PyObject_TryConvert_AddRules("datetime.date", [(Date, PyDate_TryConvertRule_date, 100)])
211-
PyObject_TryConvert_AddRules(
212-
"datetime.datetime",
213-
[(DateTime, PyDateTime_TryConvertRule_datetime, 100)],
214-
)
215-
PyObject_TryConvert_AddRules(
216-
"datetime.timedelta",
217-
[
218-
(Dates.Period, PyTimeDelta_TryConvertRule_period, 100),
219-
(Dates.CompoundPeriod, PyTimeDelta_TryConvertRule_compoundperiod),
220-
],
221-
)
222-
PyObject_TryConvert_AddRules(
223-
"juliacall.ValueBase",
224-
[(Any, PyJuliaValue_TryConvert_any, 1000)],
225-
)
226-
PyObject_TryConvert_AddExtraTypes([
227-
PyIterableABC_Type,
228-
PyCallableABC_Type,
229-
PySequenceABC_Type,
230-
PyMappingABC_Type,
231-
PySetABC_Type,
232-
PyNumberABC_Type,
233-
PyComplexABC_Type,
234-
PyRealABC_Type,
235-
PyRationalABC_Type,
236-
PyIntegralABC_Type,
237-
])
104+
PyObject_TryConvert_AddRule("builtins.NoneType", Nothing, PyNone_TryConvertRule_nothing, 100)
105+
PyObject_TryConvert_AddRule("builtins.NoneType", Missing, PyNone_TryConvertRule_missing)
106+
PyObject_TryConvert_AddRule("builtins.bool", Bool, PyBool_TryConvertRule_bool, 100)
107+
PyObject_TryConvert_AddRule("numbers.Integral", Integer, PyLongable_TryConvertRule_integer, 100)
108+
PyObject_TryConvert_AddRule("numbers.Integral", Rational, PyLongable_TryConvertRule_tryconvert)
109+
PyObject_TryConvert_AddRule("numbers.Integral", Real, PyLongable_TryConvertRule_tryconvert)
110+
PyObject_TryConvert_AddRule("numbers.Integral", Number, PyLongable_TryConvertRule_tryconvert)
111+
PyObject_TryConvert_AddRule("numbers.Integral", Any, PyLongable_TryConvertRule_tryconvert)
112+
PyObject_TryConvert_AddRule("builtins.float", Float64, PyFloatable_TryConvertRule_convert, 100)
113+
PyObject_TryConvert_AddRule("numbers.Real", Float64, PyFloatable_TryConvertRule_convert)
114+
PyObject_TryConvert_AddRule("numbers.Real", BigFloat, PyFloatable_TryConvertRule_convert)
115+
PyObject_TryConvert_AddRule("numbers.Real", Float32, PyFloatable_TryConvertRule_convert)
116+
PyObject_TryConvert_AddRule("numbers.Real", Float16, PyFloatable_TryConvertRule_convert)
117+
PyObject_TryConvert_AddRule("numbers.Real", AbstractFloat, PyFloatable_TryConvertRule_tryconvert)
118+
PyObject_TryConvert_AddRule("numbers.Real", Real, PyFloatable_TryConvertRule_tryconvert)
119+
PyObject_TryConvert_AddRule("numbers.Real", Number, PyFloatable_TryConvertRule_tryconvert)
120+
PyObject_TryConvert_AddRule("builtins.complex", Complex{Float64}, PyComplexable_TryConvertRule_convert, 100)
121+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{Float64}, PyComplexable_TryConvertRule_convert)
122+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{BigFloat}, PyComplexable_TryConvertRule_convert)
123+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{Float32}, PyComplexable_TryConvertRule_convert)
124+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{Float16}, PyComplexable_TryConvertRule_convert)
125+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{T} where {T<:AbstractFloat}, PyComplexable_TryConvertRule_tryconvert)
126+
PyObject_TryConvert_AddRule("numbers.Complex", Complex{T} where {T<:Real}, PyComplexable_TryConvertRule_tryconvert)
127+
PyObject_TryConvert_AddRule("numbers.Complex", Number, PyComplexable_TryConvertRule_tryconvert)
128+
PyObject_TryConvert_AddRule("builtins.bytes", Vector{UInt8}, PyBytes_TryConvertRule_vector)
129+
PyObject_TryConvert_AddRule("builtins.bytes", Vector{Int8}, PyBytes_TryConvertRule_vector)
130+
PyObject_TryConvert_AddRule("builtins.bytes", String, PyBytes_TryConvertRule_string)
131+
PyObject_TryConvert_AddRule("builtins.str", String, PyUnicode_TryConvertRule_string, 100)
132+
PyObject_TryConvert_AddRule("builtins.str", Symbol, PyUnicode_TryConvertRule_symbol)
133+
PyObject_TryConvert_AddRule("builtins.str", Char, PyUnicode_TryConvertRule_char)
134+
PyObject_TryConvert_AddRule("builtins.str", Vector{UInt8}, PyUnicode_TryConvertRule_vector)
135+
PyObject_TryConvert_AddRule("builtins.str", Vector{Int8}, PyUnicode_TryConvertRule_vector)
136+
PyObject_TryConvert_AddRule("builtins.tuple", Tuple, PyIterable_ConvertRule_tuple, 100)
137+
PyObject_TryConvert_AddRule("builtins.range", StepRange{T,S} where {T<:Integer,S<:Integer}, PyRange_TryConvertRule_steprange, 100)
138+
PyObject_TryConvert_AddRule("builtins.range", UnitRange{T} where {T<:Integer}, PyRange_TryConvertRule_unitrange)
139+
PyObject_TryConvert_AddRule("collections.abc.Iterable", Vector, PyIterable_ConvertRule_vecorset)
140+
PyObject_TryConvert_AddRule("collections.abc.Iterable", Set, PyIterable_ConvertRule_vecorset)
141+
PyObject_TryConvert_AddRule("collections.abc.Iterable", Tuple, PyIterable_ConvertRule_tuple)
142+
PyObject_TryConvert_AddRule("collections.abc.Iterable", NamedTuple, PyIterable_ConvertRule_namedtuple)
143+
PyObject_TryConvert_AddRule("collections.abc.Iterable", Pair, PyIterable_ConvertRule_pair)
144+
PyObject_TryConvert_AddRule("collections.abc.Sequence", Vector, PyIterable_ConvertRule_vecorset)
145+
PyObject_TryConvert_AddRule("collections.abc.Set", Set, PyIterable_ConvertRule_vecorset)
146+
PyObject_TryConvert_AddRule("collections.abc.Mapping", Dict, PyMapping_ConvertRule_dict)
147+
PyObject_TryConvert_AddRule("datetime.time", Time, PyTime_TryConvertRule_time, 100)
148+
PyObject_TryConvert_AddRule("datetime.date", Date, PyDate_TryConvertRule_date, 100)
149+
PyObject_TryConvert_AddRule("datetime.datetime", DateTime, PyDateTime_TryConvertRule_datetime, 100)
150+
PyObject_TryConvert_AddRule("datetime.timedelta", Dates.Period, PyTimeDelta_TryConvertRule_period, 100)
151+
PyObject_TryConvert_AddRule("datetime.timedelta", Dates.CompoundPeriod, PyTimeDelta_TryConvertRule_compoundperiod)
152+
PyObject_TryConvert_AddRule("juliacall.ValueBase", Any, PyJuliaValue_TryConvert_any, 1000)
153+
PyObject_TryConvert_AddExtraType(PyIterableABC_Type)
154+
PyObject_TryConvert_AddExtraType(PyCallableABC_Type)
155+
PyObject_TryConvert_AddExtraType(PySequenceABC_Type)
156+
PyObject_TryConvert_AddExtraType(PyMappingABC_Type)
157+
PyObject_TryConvert_AddExtraType(PySetABC_Type)
158+
PyObject_TryConvert_AddExtraType(PyNumberABC_Type)
159+
PyObject_TryConvert_AddExtraType(PyComplexABC_Type)
160+
PyObject_TryConvert_AddExtraType(PyRealABC_Type)
161+
PyObject_TryConvert_AddExtraType(PyRationalABC_Type)
162+
PyObject_TryConvert_AddExtraType(PyIntegralABC_Type)
238163

239164
### ctypes
240165
for (p, T) in [
@@ -262,30 +187,20 @@ include("arg.jl")
262187
isfloat = occursin("float", p) || occursin("double", p)
263188
isint = !(isfloat || isptr)
264189
isreal = isint || isfloat
265-
PyObject_TryConvert_AddRules(
266-
"ctypes.c_$p",
267-
[
268-
(
269-
p == "char_p" ? Cstring : p == "wchar_p" ? Cwstring : Union{},
270-
PySimpleCData_TryConvert_value{T,false}(),
271-
),
272-
(T, PySimpleCData_TryConvert_value{T,false}()),
273-
(isint ? Integer : Union{}, PySimpleCData_TryConvert_value{T,true}()),
274-
(isint ? Rational : Union{}, PySimpleCData_TryConvert_value{T,true}()),
275-
(isreal ? Float64 : Union{}, PySimpleCData_TryConvert_value{T,false}()),
276-
(isreal ? BigFloat : Union{}, PySimpleCData_TryConvert_value{T,false}()),
277-
(isreal ? Float32 : Union{}, PySimpleCData_TryConvert_value{T,false}()),
278-
(isreal ? Float16 : Union{}, PySimpleCData_TryConvert_value{T,false}()),
279-
(
280-
isreal ? AbstractFloat : Union{},
281-
PySimpleCData_TryConvert_value{T,true}(),
282-
),
283-
(isreal ? Real : Union{}, PySimpleCData_TryConvert_value{T,true}()),
284-
(isreal ? Number : Union{}, PySimpleCData_TryConvert_value{T,true}()),
285-
(isptr ? Ptr : Union{}, PySimpleCData_TryConvert_value{T,false}()),
286-
(Any, PySimpleCData_TryConvert_value{T,true}()),
287-
],
288-
)
190+
p == "char_p" && PyObject_TryConvert_AddRule("ctypes.c_$p", Cstring, PySimpleCData_TryConvert_value{T,false}())
191+
p == "wchar_p" && PyObject_TryConvert_AddRule("ctypes.c_$p", Cwstring, PySimpleCData_TryConvert_value{T,false}())
192+
PyObject_TryConvert_AddRule("ctypes.c_$p", T, PySimpleCData_TryConvert_value{T,false}())
193+
isint && PyObject_TryConvert_AddRule("ctypes.c_$p", Integer, PySimpleCData_TryConvert_value{T,true}())
194+
isint && PyObject_TryConvert_AddRule("ctypes.c_$p", Rational, PySimpleCData_TryConvert_value{T,true}())
195+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", Float64, PySimpleCData_TryConvert_value{T,false}())
196+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", BigFloat, PySimpleCData_TryConvert_value{T,false}())
197+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", Float32, PySimpleCData_TryConvert_value{T,false}())
198+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", Float16, PySimpleCData_TryConvert_value{T,false}())
199+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", AbstractFloat, PySimpleCData_TryConvert_value{T,true}())
200+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", Real, PySimpleCData_TryConvert_value{T,true}())
201+
isreal && PyObject_TryConvert_AddRule("ctypes.c_$p", Number, PySimpleCData_TryConvert_value{T,true}())
202+
isptr && PyObject_TryConvert_AddRule("ctypes.c_$p", Ptr, PySimpleCData_TryConvert_value{T,false}())
203+
PyObject_TryConvert_AddRule("ctypes.c_$p", Any, PySimpleCData_TryConvert_value{T,true}())
289204
end
290205

291206
### numpy
@@ -313,52 +228,23 @@ include("arg.jl")
313228
isfloat = occursin("float", p)
314229
iscomplex = occursin("complex", p)
315230
isreal = isint || isfloat
316-
PyObject_TryConvert_AddRules(
317-
"numpy.$p",
318-
[
319-
(T, PyNumpySimpleData_TryConvert_value{T,false}(), 100),
320-
(isint ? Integer : Union{}, PyNumpySimpleData_TryConvert_value{T,true}()),
321-
(isint ? Rational : Union{}, PyNumpySimpleData_TryConvert_value{T,true}()),
322-
(isreal ? Float64 : Union{}, PyNumpySimpleData_TryConvert_value{T,false}()),
323-
(
324-
isreal ? BigFloat : Union{},
325-
PyNumpySimpleData_TryConvert_value{T,false}(),
326-
),
327-
(isreal ? Float32 : Union{}, PyNumpySimpleData_TryConvert_value{T,false}()),
328-
(isreal ? Float16 : Union{}, PyNumpySimpleData_TryConvert_value{T,false}()),
329-
(
330-
isreal ? AbstractFloat : Union{},
331-
PyNumpySimpleData_TryConvert_value{T,true}(),
332-
),
333-
(isreal ? Real : Union{}, PyNumpySimpleData_TryConvert_value{T,true}()),
334-
(
335-
iscomplex ? Complex{Float64} : Union{},
336-
PyNumpySimpleData_TryConvert_value{T,false}(),
337-
),
338-
(
339-
iscomplex ? Complex{BigFloat} : Union{},
340-
PyNumpySimpleData_TryConvert_value{T,false}(),
341-
),
342-
(
343-
iscomplex ? Complex{Float32} : Union{},
344-
PyNumpySimpleData_TryConvert_value{T,false}(),
345-
),
346-
(
347-
iscomplex ? Complex{Float16} : Union{},
348-
PyNumpySimpleData_TryConvert_value{T,false}(),
349-
),
350-
(
351-
iscomplex ? (Complex{T} where {T<:AbstractFloat}) : Union{},
352-
PyNumpySimpleData_TryConvert_value{T,true}(),
353-
),
354-
(
355-
iscomplex ? (Complex{T} where {T<:Real}) : Union{},
356-
PyNumpySimpleData_TryConvert_value{T,true}(),
357-
),
358-
(Number, PyNumpySimpleData_TryConvert_value{T,true}()),
359-
(Any, PyNumpySimpleData_TryConvert_value{T,true}()),
360-
],
361-
)
231+
PyObject_TryConvert_AddRule("numpy.$p", T, PyNumpySimpleData_TryConvert_value{T,false}(), 100)
232+
isint && PyObject_TryConvert_AddRule("numpy.$p", Integer, PyNumpySimpleData_TryConvert_value{T,true}())
233+
isint && PyObject_TryConvert_AddRule("numpy.$p", Rational, PyNumpySimpleData_TryConvert_value{T,true}())
234+
isreal && PyObject_TryConvert_AddRule("numpy.$p", Float64, PyNumpySimpleData_TryConvert_value{T,false}())
235+
isreal && PyObject_TryConvert_AddRule("numpy.$p", BigFloat, PyNumpySimpleData_TryConvert_value{T,false}())
236+
isreal && PyObject_TryConvert_AddRule("numpy.$p", Float32, PyNumpySimpleData_TryConvert_value{T,false}())
237+
isreal && PyObject_TryConvert_AddRule("numpy.$p", Float16, PyNumpySimpleData_TryConvert_value{T,false}())
238+
isreal && PyObject_TryConvert_AddRule("numpy.$p", AbstractFloat, PyNumpySimpleData_TryConvert_value{T,true}())
239+
isreal && PyObject_TryConvert_AddRule("numpy.$p", Real, PyNumpySimpleData_TryConvert_value{T,true}())
240+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{Float64}, PyNumpySimpleData_TryConvert_value{T,false}())
241+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{BigFloat}, PyNumpySimpleData_TryConvert_value{T,false}())
242+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{Float32}, PyNumpySimpleData_TryConvert_value{T,false}())
243+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{Float16}, PyNumpySimpleData_TryConvert_value{T,false}())
244+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{T} where {T<:AbstractFloat}, PyNumpySimpleData_TryConvert_value{T,true}())
245+
iscomplex && PyObject_TryConvert_AddRule("numpy.$p", Complex{T} where {T<:Real}, PyNumpySimpleData_TryConvert_value{T,true}())
246+
PyObject_TryConvert_AddRule("numpy.$p", Number, PyNumpySimpleData_TryConvert_value{T,true}())
247+
PyObject_TryConvert_AddRule("numpy.$p", Any, PyNumpySimpleData_TryConvert_value{T,true}())
362248
end
363249
end
364250

src/cpython/as.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
@init PyObject_TryConvert_AddRules("juliacall.As", [
2-
(Any, PyAs_ConvertRule_tryconvert),
3-
])
1+
@init PyObject_TryConvert_AddRule("juliacall.As", Any, PyAs_ConvertRule_tryconvert)
42

53
PyAs_ConvertRule_tryconvert(o, ::Type{S}) where {S} = begin
64
# get the type

0 commit comments

Comments
 (0)